gpt4 book ai didi

c# - Fire and Forgot 的异步/等待方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:59:37 25 4
gpt4 key购买 nike

假设我在 winforms 应用程序中有以下代码。

    private async Task<decimal> DivAsync(int a, int b)
{
await TaskEx.Delay(2000);
return a / b;
}

private async Task DivAsyncWithErrorHandling(int a, int b)
{
try
{
await DivAsync(a, b);
}
catch (DivideByZeroException)
{
Debug.WriteLine("DivAsync({0}, {1}) failed", a, b);
}
}

private void button1_Click(object sender, EventArgs e)
{
DivAsyncWithErrorHandling(5, 0);
}

private void button2_Click(object sender, EventArgs e)
{
TaskEx.Run(() => DivAsyncWithErrorHandling(5, 0));
}

private async void button3_Click(object sender, EventArgs e)
{
await DivAsyncWithErrorHandling(5, 0);
await SomeThingElse();
}

显然,我的真实文字代码还做了其他事情。关键是,我已经有了错误处理。代码 DivAsyncWithErrorHandling 可能与 await 一起运行(参见示例 button3_Click)所以我不能使用 async void 方法但也可能被火烧掉而被遗忘。

button1_Clickbutton2_Click 都产生异常结果(DivAsyncWithErrorHandling 是异步运行的,不会阻塞 ui,但具有不同的优点/缺点。

button1_Click 显示警告 因为未等待此调用,执行...在调用完成之前继续。 但代码较少

enter image description here

button2_Click 未显示警告,但有更多代码要编写并使用另一个任务。

所以我的问题是。在这种情况下最好的解决方案是什么?忽略警告并使用 button1 或使用 button2

也许已经有一个更好的解决方案已经构建,类似于 task.RunSynchronously 但火了就忘了。

DivAsyncWithErrorHandling(5, 0).RunAsynchronously();

目的是将“旧式”例程转换为异步/等待模式,该例程在完成后采取可选操作继续进行

    private DivAsyncWithErrorHandlingOld(int a, int b, Action after = null)
{
Task.Factory.StartNew(() =>
{
try
{
Div(a, b);
}
catch (DivideByZeroException)
{
Debug.WriteLine("DivAsync({0}, {1}) failed", a, b);
}
after?.Invoke();
});
}

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