返回 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 上没有很多可见的效果,并且添加了很多高架。如果您不确切知道多任务将如何使用,它可能会导致更多的延迟而不是帮助,因为所有这些都发生在服务器上,而不是在不需要这种多任务的客户端上。