Jam*_*ees 5 c# asynchronous async-await
我找不到有关实际差异的任何信息。
所以我一直在做以下事情:
public async Task<int> DoSomethingAsync()
{
DoSomethingElse()
var result = await GetValueAsync();
var intValue = DoAnotherThing(result);
return intValue;
}
Run Code Online (Sandbox Code Playgroud)
await 电话,然后直接使用它,但我最近看到一些帖子,人们正在做以下事情:
public async Task<int> DoSomethingAsync()
{
var task = GetValueAsync();
DoSomethingElse()
var result = await task;
var intValue = DoAnotherThing(result);
return intValue;
}
Run Code Online (Sandbox Code Playgroud)
那么这是否意味着该方法GetValueAsync正在开始执行,然后我们稍后等待它的结果?或者这是否意味着它正在同步执行但它仍然await能够?
Damien_The_Unbeliever 说得对,这取决于实现。
class Program
{
public static int DoAnotherThing(string value)
{
return int.Parse(value);
}
public static async Task<string> GetValueAsync()
{
await Task.Delay(5000);
return "12";
}
public static void DoSomethingElse()
{
Thread.Sleep(5000);
}
public static async Task<int> DoSomethingAsyncA()
{
DoSomethingElse();
var result = await GetValueAsync();
var intValue = DoAnotherThing(result);
return intValue;
}
public static async Task<int> DoSomethingAsyncB()
{
var task = GetValueAsync();
DoSomethingElse();
var result = await task;
var intValue = DoAnotherThing(result);
return intValue;
}
public static void Measure(Action act)
{
var sw = new Stopwatch();
sw.Start();
act();
sw.Stop();
Console.WriteLine(sw.Elapsed);
}
static void Main(string[] args)
{
Measure(() => DoSomethingAsyncA().Wait());
Measure(() => DoSomethingAsyncB().Wait());
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下DoSomethingAsyncB将需要约 5 秒,其中DoSomethingAsyncA将需要约 10秒。但是,如果您GetValueAsync返回的值计算是在其他地方开始的,那么将没有区别。
更新 我更正了答案中的错误。这是我机器的输出:
00:00:10:0161446
00:00:05:0032000
Run Code Online (Sandbox Code Playgroud)