返回任务<bool>并返回bool

时间:2016-04-25 11:04:42

标签: c# asp.net asp.net-mvc task-parallel-library

希望这是一个很好而简单的答案。

我在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中等待代码完成?

提前感谢任何提示!

3 个答案:

答案 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上没有很多可见的效果,并增加了很多开销。如果您不确切知道多任务的使用方式,可能会导致延迟而不是帮助,因为所有这些都发生在服务器上,而不是客户端上,不需要这种多任务。