【问题标题】:Whats the difference with returning Task<bool> and just returning bool返回 Task<bool> 和只返回 bool 有什么区别
【发布时间】:2016-04-25 11:04:42
【问题描述】:

希望这是一个不错且简单的答案。

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

提前感谢您的任何提示!

【问题讨论】:

  • 任何对将像示例 1 一样实现的真实代码的引用(即内部不等待任何内容的异步方法)?
  • 在不使用await的方法中使用async修饰符是不必要的,它会生成一个复杂的状态机。

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


【解决方案1】:

在您的场景中,async 运算符将停止方法的执行,直到收到来自 LowerLevelCall 的结果。但是,当方法的执行停止时,await 会异步等待,因此线程本身不会被阻塞。从LowerLevelCall 获取结果后,该方法将继续同步执行。

示例 1 - 如果 LowerLevelCall 需要很长时间才能执行,您的线程将被阻塞,并且会坐在那里什么都不做,直到 LowerLevelCall 的执行完成。

示例 2 - 如果使用 await,则不会阻塞线程,因为 await 异步等待。在LowerLevelCall 完成执行后,方法的结果将分配给您的result 变量。

Intro to Async And Await - 这篇文章应该可以帮助您开始使用 async 和 await。

【讨论】:

  • 谢谢大家!这些答案都有道理!我选择了这个作为我的“答案”,因为它很好、简单、切中要害,并且链接到另一个有用的资源。
【解决方案2】:

在第一个示例中,如果 LowerLevelCall(model); 需要很长时间,则在此方法完成之前不会返回您的结果,这将阻塞当前线程 - 您必须一直等待,什么都不做。

在第二个示例中,当前线程不会被阻塞,您可以执行其他操作。当LowerLevelCall(model); 完成时,您将异步获取结果。

【讨论】:

    【解决方案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);
    }
    

    一些cmets

    asp.net 的所有这些内联功能旨在简化和帮助异步执行线程工作。在桌面编程上有一点有助于不将“绘制”消息从窗口保存到您的程序,但在 asp.net 上没有很多可见的效果,并增加了很多开销。如果您不确切知道如何使用多任务,它可能会导致更多的延迟而不是帮助,因为所有这些都发生在服务器上,而不是在不需要这种多任务的客户端上。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 2011-09-19
      • 2018-05-27
      • 2012-08-24
      • 2019-03-07
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多