假设我在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_Click
和button2_Click
都会产生例外结果(DivAsyncWithErrorHandling
在不阻止ui的情况下异步运行,但具有不同的优点/缺点。
button1_Click
显示警告Because this call is not awaited, execution ... continues before the call is complete.
,但代码较少
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();
});
}
答案 0 :(得分:-1)
使用Task.Run,因为它发生的事情更明显,这是推荐的方法。
&#34;当不需要对任务的创建和调度进行更多控制时,Run方法是创建和启动任务的首选方式。&#34; 资料来源:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming
&#34;如果您的工作受CPU限制并且您关心响应能力,请使用async并等待,但使用Task.Run在另一个线程上生成工作。&#34; 资料来源:https://docs.microsoft.com/en-us/dotnet/csharp/async