希望这是一个很好而简单的答案。
我在ASP.NET Core 1中使用C#MVC Web API。我正在创建Web方法,我已经看到了返回数据的示例。
示例1:
public async Task<IActionResult> ExampleCall([FromBody]ExampleObj model)
{
// Call some lower level function...
var result = LowerLevelCall(model);
return result;
}
看过这样的其他例子。
示例2:
public async Task<IActionResult> ExampleCall([FromBody]ExampleObj model)
{
// Call some lower level function...
var result = await LowerLevelCall(model);
return result;
}
主要区别在于使用await
运算符的示例2。实施await
运算符的含义是什么?这个免费资源是否会在示例1中等待代码完成?
提前感谢任何提示!
答案 0 :(得分:5)
在您的方案中,async
运算符将停止执行方法,直到从LowerLevelCall
收到结果。但是,当停止执行该方法时,await
将异步等待,因此不会阻止该线程本身。从LowerLevelCall
获得结果后,该方法只是恢复同步执行。
示例1 - 如果LowerLevelCall
需要很长时间才能执行,那么您的线程将被阻止,并且只有在LowerLevelCall
的执行完成后才会执行任何操作。
示例2 - 如果使用await
,则不会阻止线程,因为await
异步等待。完成LowerLevelCall
后,方法的结果将分配给您的result
变量。
Intro to Async And Await - 本文应该可以帮助您开始使用异步和等待。
答案 1 :(得分:4)
在第一个示例中,如果LowerLevelCall(model);
需要很长时间,则在此方法完成之前不会返回结果,这将阻止当前线程 - 您必须等待所有这些时间无所事事。
在第二个示例中,当前线程不会被阻止,您可以执行其他操作。当LowerLevelCall(model);
完成时,您将以异步方式获得结果。
答案 2 :(得分:3)
不同的是,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);
}
asp.net的所有这些内联功能都有简化和帮助异步执行线程工作的目的。有一点关于桌面编程有助于不从窗口向你的程序保存“绘制”消息,但在asp.net上没有很多可见的效果,并增加了很多开销。如果您不确切知道多任务的使用方式,可能会导致延迟而不是帮助,因为所有这些都发生在服务器上,而不是客户端上,不需要这种多任务。