gpt4 book ai didi

f# - 将 C# 异步方法转换为 F# 函数

转载 作者:行者123 更新时间:2023-12-02 08:14:02 25 4
gpt4 key购买 nike

我想将下面的 C# 方法 DelayNe 转换为 F# 函数,这样它就可以从 C# 中以完全相同的方式使用。原因是我想把它放在 F# 库中。我在谷歌上苦苦挣扎,试图通过谷歌找到答案,但显然运气不佳。

更新:抱歉没说清楚。我的任务以您在下面的 DelayNe 方法中看到的方式调用 Task.Delay。问题是当调用 _cancellationTokenSource.Cancel() 时,Task.Delay 会抛出异常,而我不希望出现该异常。换句话说,我相信我需要一个围绕 Task.Delay 的包装器,它将捕获异常并将其静音,但否则会完全按原样公开 Task.Delay 的行为。我想在 F# 中实现包装器。

private CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();

async Task DelayNe(int milliSeconds, CancellationToken token)
{
try
{
await Task.Delay(milliSeconds, token);
}
catch (TaskCanceledException ex)
{
("Silencing " + ex.GetType().Name + ", " + ex.Message).Dump();
}
}

async Task Test(CancellationToken cancellationToken)
{
try
{
"Test start".Dump();
await DelayNe(5000, cancellationToken);
"Test stop".Dump();
}
catch (Exception ex)
{
("Catch: " + ex.Message + ", " + ex.GetType().Name).Dump();
}
}

async Task Main()
{
"Start".Dump();
_cancellationTokenSource.CancelAfter(1000);
var testTask = Test(_cancellationTokenSource.Token);
await testTask;
"Stop".Dump();
}

最佳答案

F# 异步工作流具有对取消的内置支持,因此使用这些而不是处理任务可能会让您的生活更轻松。您的问题并没有真正提供足够的信息来理解您要做什么,但下面是一个使用 async 的示例,该示例非常接近您的示例:

let delayNe ms = async {
use! _d = Async.OnCancel(fun () ->
printfn "cancelled!")
do! Async.Sleep(ms) }

let test = async {
printfn "Test start"
do! delayNe 5000
printfn "Test stop" }

let DoWork () =
let cts = new System.Threading.CancellationTokenSource()
cts.CancelAfter(1000)
Async.StartAsTask(test, cancellationToken = cts.Token)

DoWork 函数将工作作为任务启动,可以从 C# 中轻松使用。

关于f# - 将 C# 异步方法转换为 F# 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43610506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com