【问题标题】:Function Running Sync When VS Says it should be running async函数运行同步时 VS 说它应该运行异步
【发布时间】:2015-06-14 02:14:38
【问题描述】:

为什么 B 运行同步? Vs 说。“由于不等待此调用,因此在调用完成之前继续执行当前方法。” ;

A) Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async

B) Funcation(1, 1); // Says it runs async in vs, but really runs sync.
C)  var handleOne = Task.Run(() =>
        {
            Funcation(1, 1);
        }); // Runs Async
D) await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly
E) await Funcation(1, 1); //awaits correctly


 static private async Task<int> Funcation(int x, int y)
 {
     Task.Delay(1000).Wait();
 }

【问题讨论】:

    标签: c# .net async-await


    【解决方案1】:

    Funcation 使用了async 关键字,但它的主体中没有使用await,因此它将始终同步运行。 Function 也无法编译。

    A)

    Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async
    

    在这里您创建一个线程并在该线程上调用Function,因此它是异步的,因为它正在另一个线程上运行。

    B)

    Funcation(1, 1);
    

    Function 被标记为async,但在它被调用的地方没有被标记为awaited。在这种情况下,编译器不会检查Function 是否在它的主体中使用await(它已经在你的函数声明中告诉你)。它只是检查您是否正在调用异步方法而不等待它。

    C)

    var handleOne = Task.Run(() => { Funcation(1, 1); }); // Runs Async
    

    我不太确定这个,如果有人知道这里发生了什么,请帮忙。

    D)

    await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly
    

    A 相同,但您等待创建的任务,一切正常。创建一个任务来运行异步操作也是一个非常糟糕的主意。

    E)

    await Funcation(1, 1); //awaits correctly
    

    我们真的会发生其他事情吗?这确实是您应该使用asyncawait 的方式。

    【讨论】:

    • B 仍然是我在运行代码时感到困惑的地方,它似乎是 B,不运行异步。它似乎运行同步,因为它阻止当前线程向前移动。在 B 被调用直到 B 完成后,什么都不会运行。就 B 而言,它是异步运行还是同步运行?
    • 编译器在函数声明中告诉您,您的异步方法不会等待任何内容,因此它将同步运行,当您像 B 一样调用它时,它将同步运行跨度>
    • “在调用完成之前继续执行当前方法”我认为这意味着调用是异步的,因为当前方法将继续。 K 所以我误解了 vs 告诉我的内容。我想我明白了。
    【解决方案2】:

    您的函数正在使用Wait,这是阻塞。请改用await。此外,您将任务定义为 Task&lt;int&gt;,但没有返回任何结果 - 这不会编译。应该是这样的:

    static private async Task<int> Funcation(int x, int y)
    {
        await Task.Delay(1000);
    
        return x + y; // some int result
    }
    

    使用您的代码“E”来调用。其他调用均不正确。

    另外,如果您的代码真的不需要延迟,那么这将不是异步的好用例。异步操作应该做长时间运行或受 IO 限制的事情。如果您的代码只是执行简单的算术运算,那么只需将其设为传统的同步方法即可。

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2023-02-05
      相关资源
      最近更新 更多