当 VS 说它应该异步运行时运行同步的函数

本文关键字:运行 运行时 同步 函数 异步 VS | 更新日期: 2023-09-27 17:56:07

为什么 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();
 }

当 VS 说它应该异步运行时运行同步的函数

Funcation正在使用

async关键字,但不await其正文中的任何内容,因此它将始终同步运行。 此外,Function甚至不编译。

一)

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

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

二)

Funcation(1, 1);

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

(三))

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 .

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

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

使用您的代码"E"进行调用。 其他调用都是不正确的。

此外,如果您的代码确实不需要延迟,那么这对于异步来说不是一个很好的用例。 异步操作应该执行长时间运行或 IO 绑定的操作。 如果你的代码只是执行简单的算术,那么就让它成为传统的同步方法。