当 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();
}
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
我们真的没有其他事情发生吗?这确实是您应该使用的方式 async
和 await
.
您的函数正在使用 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 绑定的操作。 如果你的代码只是执行简单的算术,那么就让它成为传统的同步方法。