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真正有用呢?在什么情况下?谢谢。
任务类型不能执行的c#async / await能做什么?
异步代码已经存在了很长时间。如果我不得不猜测的话,大概是1960年代。在.NET时间范围内,从一开始就存在异步代码模式-.NET 1.0中。
因此,以上问题的一个答案(有点古怪)是“没事”。async并await没有带来任何新功能;异步代码始终是可能的。
是什么使async / await真正有用?在什么情况下?
的主要优点async和await是代码的可维护性。我有一个演讲,探讨异步设计的演变,从事件到回调再到诺言,最后是async/ await。在每一步,代码更容易维护,但它永远不会接近相当于可维护性同步代码,直到async并await进入画面。
具体来说,您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)