任务类型不能执行的c#async / await能做什么?

Jos*_*eph 0 c# asynchronous async-await

我是C#异步/等待功能的新手,经过研究,我认为我已经很好地理解了这些关键字想要完成的工作。但是我想到这个问题:有些事情使async / await使使用Task类型无法完成的事情成为可能?考虑以下示例:

static async Task<int> jobAsync()
{
    // I could be writing here "await someTask()"
    await Task.Delay(2000);
    return 1;
}

static async void simpleAsync()
{
    int i = await jobAsync();
    Console.WriteLine("Async done. Result: " + i.ToString());
}

static void simpleTask()
{
    var t = Task.Run(() => { 
    //I could be writing here "return someTask();"
    Thread.Sleep(2000); return 1; });
    t.ContinueWith(tsk => { Console.WriteLine("Task done. Result: " + tsk.Result); });
}
Run Code Online (Sandbox Code Playgroud)

现在,两个函数“ simpleTask()”和“ simpleAsync()”给出相同的结果,例如,如果调用Main方法:

static void Main(string[] args)
{
    simpleTask();
    //simpleAsync();
    Console.WriteLine("Doing other things...");
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个简单的示例,但是什么使async / await真正有用呢?在什么情况下?谢谢。

Ste*_*ary 5

任务类型不能执行的c#async / await能做什么?

异步代码已经存在了很长时间。如果我不得不猜测的话,大概是1960年代。在.NET时间范围内,从一开始就存在异步代码模式-.NET 1.0中

因此,以上问题的一个答案(有点古怪)是“没事”。asyncawait没有带来任何新功能;异步代码始终是可能的。

是什么使async / await真正有用?在什么情况下?

的主要优点asyncawait是代码的可维护性。我有一个演讲,探讨异步设计的演变,从事件到回调再到诺言,最后是async/ await。在每一步,代码更容易维护,但它永远不会接近相当于可维护性同步代码,直到asyncawait进入画面。

具体来说,您simpleTask正在使用带有连续性的Promise;这是下一个最可维护的模式。类似于async/,await直到您尝试使用state进行构建为止。尝试用诺言做到这一点,您就会明白我的意思:

Task<int> GetDataCoreAsync();

async Task<int> GetDataAsync()
{
  int retries = 10;
  while (retries > 0)
  {
    try { return await GetDataCoreAsync(); }
    catch (Exception ex)
    {
      --retries;
      if (retries == 0)
        throw;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)