它们之间的不同在于使用await
关键字的函数会等待自己执行完毕后再返回结果。现在,在我进行一些测试的网页上,这两个函数中没有一个阻塞了代码运行,它们都在一个线程上继续运行。
public async Task<IActionResult> ExampleCall([FromBody]ExampleObj model)
{
var result = await LowerLevelCall(model);
return result;
}
让我们进入内部... 我创建了两个与你的函数类似的函数。
public static async Task<bool> Task1()
{
await Task.Delay(10000);
return true;
}
public static async Task<bool> Task2()
{
Task.Delay(10000);
return true;
}
这两个代码的最终版本有很大的不同。
使用await关键字
private void MoveNext()
{
bool flag;
int num = this.<>1__state;
try
{
TaskAwaiter awaiter;
if (num != 0)
{
awaiter = Task.Delay(0x2710).GetAwaiter();
if (!awaiter.IsCompleted)
{
this.<>1__state = num = 0;
this.<>u__1 = awaiter;
cTestClass.<Task1>d__0 stateMachine = this;
this.<>t__builder.AwaitUnsafeOnCompleted<TaskAwaiter, cTestClass.<Task1>d__0>(ref awaiter, ref stateMachine);
return;
}
}
else
{
awaiter = this.<>u__1;
this.<>u__1 = new TaskAwaiter();
this.<>1__state = num = -1;
}
awaiter.GetResult();
awaiter = new TaskAwaiter();
flag = true;
}
catch (Exception exception)
{
this.<>1__state = -2;
this.<>t__builder.SetException(exception);
return;
}
this.<>1__state = -2;
this.<>t__builder.SetResult(flag);
}
无需
private void MoveNext()
{
bool flag;
int num = this.<>1__state;
try
{
Task.Delay(0x2710);
flag = true;
}
catch (Exception exception)
{
this.<>1__state = -2;
this.<>t__builder.SetException(exception);
return;
}
this.<>1__state = -2;
this.<>t__builder.SetResult(flag);
}
一些评论
ASP.NET的内联功能旨在简化和帮助异步执行线程工作。在桌面编程中,它有一个作用,可以避免将“绘制”消息从Windows保留到您的程序中,但在ASP.NET中并没有很多可见的影响,并且增加了很多开销。如果您不确切知道如何使用多任务,它可能会导致更多的延迟而不是帮助,因为所有操作都发生在服务器上,而客户端不需要这种类型的多任务。
await
的方法中使用async
修饰符是不必要的,它会为无用的生成一个复杂的状态机。 - Lasse V. Karlsen