返回 Task<bool> 和只返回 bool 有什么区别
Whats the difference with returning Task<bool> and just returning bool
希望这是一个简单明了的答案。
我在 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;
}
主要区别在于示例 2 使用了 await
运算符。实施 await
运算符的含义是什么?这会释放资源而不是等待示例 1 中的代码完成吗?
提前感谢您的任何提示!
在第一个示例中,如果 LowerLevelCall(model);
花费很长时间,您的结果将不会在此方法完成之前返回,这将阻塞当前线程 - 您必须一直等待,什么都不做。
在第二个示例中,当前线程不会被阻塞,您可以做一些事情 other.You 将在 LowerLevelCall(model);
完成时异步获取结果。
在您的方案中,async
运算符将停止执行该方法,直到从 LowerLevelCall
收到结果。但是,当该方法的执行停止时,await
异步等待,因此线程本身不会被阻塞。从 LowerLevelCall
获得结果后,该方法将恢复同步执行。
示例 1 - 如果 LowerLevelCall
需要很长时间才能执行,您的线程将被阻塞并且将坐在那里什么都不做,直到 LowerLevelCall
的执行完成。
示例 2 - 如果您使用 await
,您不会阻塞线程,因为 await
是异步等待。 LowerLevelCall
完成执行后,方法的结果将分配给您的 result
变量。
Intro to Async And Await - 本文应该可以帮助您开始使用 async 和 await。
不同的是await
的函数是等待return先完成他的工作。现在在我做一些测试的网页上,这两个函数中没有一个阻止代码的 运行ning,并且它们继续在一个线程上 运行。
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 的所有这些内联功能旨在简化和帮助异步执行线程工作。在桌面编程上有一点有助于不要将 windows 的 "draw" 消息保存到您的程序,但是在 asp.net 上没有很多可见的效果,并且添加了很多高架。如果您不确切知道多任务将如何使用,它可能会导致更多的延迟而不是帮助,因为所有这些都发生在服务器上,而不是在不需要这种多任务的客户端上。
希望这是一个简单明了的答案。
我在 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;
}
主要区别在于示例 2 使用了 await
运算符。实施 await
运算符的含义是什么?这会释放资源而不是等待示例 1 中的代码完成吗?
提前感谢您的任何提示!
在第一个示例中,如果 LowerLevelCall(model);
花费很长时间,您的结果将不会在此方法完成之前返回,这将阻塞当前线程 - 您必须一直等待,什么都不做。
在第二个示例中,当前线程不会被阻塞,您可以做一些事情 other.You 将在 LowerLevelCall(model);
完成时异步获取结果。
在您的方案中,async
运算符将停止执行该方法,直到从 LowerLevelCall
收到结果。但是,当该方法的执行停止时,await
异步等待,因此线程本身不会被阻塞。从 LowerLevelCall
获得结果后,该方法将恢复同步执行。
示例 1 - 如果 LowerLevelCall
需要很长时间才能执行,您的线程将被阻塞并且将坐在那里什么都不做,直到 LowerLevelCall
的执行完成。
示例 2 - 如果您使用 await
,您不会阻塞线程,因为 await
是异步等待。 LowerLevelCall
完成执行后,方法的结果将分配给您的 result
变量。
Intro to Async And Await - 本文应该可以帮助您开始使用 async 和 await。
不同的是await
的函数是等待return先完成他的工作。现在在我做一些测试的网页上,这两个函数中没有一个阻止代码的 运行ning,并且它们继续在一个线程上 运行。
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 的所有这些内联功能旨在简化和帮助异步执行线程工作。在桌面编程上有一点有助于不要将 windows 的 "draw" 消息保存到您的程序,但是在 asp.net 上没有很多可见的效果,并且添加了很多高架。如果您不确切知道多任务将如何使用,它可能会导致更多的延迟而不是帮助,因为所有这些都发生在服务器上,而不是在不需要这种多任务的客户端上。