C# 与返回任务的普通方法相比,带有wait的异步方法
在以下程序中:C# 与返回任务的普通方法相比,带有wait的异步方法,c#,asynchronous,async-await,C#,Asynchronous,Async Await,在以下程序中: using System; using System.Threading; using System.Threading.Tasks; class Program { static async Task f() { void action() { Thread.Sleep(100); Console.WriteLine("4");
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task f()
{
void action()
{
Thread.Sleep(100);
Console.WriteLine("4");
Thread.Sleep(100);
}
await Task.Run(action);
}
static async void g()
{
Thread.Sleep(100);
Console.WriteLine("1");
Console.WriteLine("2");
await f();
Console.WriteLine("5");
}
static void Main()
{
g();
Console.WriteLine("3");
Console.ReadKey();
}
}
我可以更改函数f
,并将其编写为:
static Task f()
{
void action()
{
Thread.Sleep(100);
Console.WriteLine("4");
Thread.Sleep(100);
}
return Task.Run(action);
}
输出不变。哪个是首选?带有wait
的异步f
或返回任务的正常f
编辑:两种情况下的输出:
1
2
3
4
5
好的,问得好。让我解释一下,
如果您使用了async void
,并且该方法抛出了一些异常,因为该过程在没有等待的情况下完成,系统将无法处理该异常,并且该过程将终止应用程序
始终建议使用异步任务
或异步任务或异步任务
只要在调用时等待该方法,以检查每个发生的是否正常
对我们来说,这是一种不好的做法async void
async void g
是一个bug。这是迫不及待的。对于不返回任何结果的方法,请使用async Task
<代码>等待
等待已激活的异步操作完成,而不阻塞调用者。您不能将wait
与返回Task
的方法进行比较,因为它们根本不做相同的事情。您可以使用await
等待由返回task@PanagiotisKanavos你能帮我更正一下代码吗?在你的例子中,的输出没有改变
不是真的。如果没有使用ReadKey
阻塞主线程,应用程序将在不等待其他方法完成甚至启动的情况下终止。您必须使用async Task Main()
和await g()代码>为确保应用程序正常工作,这是否回答了您的问题?也值得一读:-StevenC的博客你是说异常处理在这两种情况下是不同的吗?如果从异步void方法抛出,则无法处理异常。尝试从async void方法引发新异常,看看会发生什么,在调用方法中使用Try catch。我的测试表明,如果在f
中引发异常,则两种情况下的结果相同。f
类型为async void
或async Task
?您可以在问题中看到完整的程序。包括f
的定义。