不同的是await的函数是等待先完成他的工作再返回。现在在我做一些测试的网页上,这两个函数中没有人阻止代码的运行,它们继续在一个线程上运行。
public async Task<IActionResult> ExampleCall([FromBody]ExampleObj model)
{
// Call some lower level function...
// ***Here is not return until this function is finish first.***
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;
}
这两个的最终代码有很大的不同。
有等待
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);
}
没有
// MoveNext is the name of warped function that call the thread.
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);
}
一些cmets
asp.net 的所有这些内联功能旨在简化和帮助异步执行线程工作。在桌面编程上有一点有助于不将“绘制”消息从窗口保存到您的程序,但在 asp.net 上没有很多可见的效果,并增加了很多开销。如果您不确切知道如何使用多任务,它可能会导致更多的延迟而不是帮助,因为所有这些都发生在服务器上,而不是在不需要这种多任务的客户端上。