C# 当VS说它应该运行异步时,函数运行Sync
B为什么运行同步?Vs说,“因为这个调用没有等待,所以在调用完成之前,当前方法的执行将继续。”C# 当VS说它应该运行异步时,函数运行Sync,c#,.net,async-await,C#,.net,Async Await,B为什么运行同步?Vs说,“因为这个调用没有等待,所以在调用完成之前,当前方法的执行将继续。” A)Task.Factory.StartNew(()=>function(1,1))//异步运行 B) 函数(1,1);//说它在vs中运行异步,但实际上运行同步。 C) var handleOne=Task.Run(()=> { 函数(1,1); }); // 异步运行 D) wait Task.Factory.StartNew(()=>function(1,1))//正确等待 E) 等待函数(1,
A)Task.Factory.StartNew(()=>function(1,1))//异步运行
B) 函数(1,1);//说它在vs中运行异步,但实际上运行同步。
C) var handleOne=Task.Run(()=>
{
函数(1,1);
}); // 异步运行
D) wait Task.Factory.StartNew(()=>function(1,1))//正确等待
E) 等待函数(1,1)//正确等待
静态专用异步任务函数(int x,int y)
{
Task.Delay(1000.Wait();
}
函数正在使用async
关键字,但不等待其主体中的任何内容,因此它将始终同步运行。而且函数
甚至不编译
A)
这里创建一个线程,并在该线程上调用函数
,因此它是异步的,因为它正在另一个线程上运行
B)
函数
标记为async
,但在调用该函数的位置未标记为wait
ed。在这种情况下,编译器不会检查函数
是否在其主体中使用wait
(它已经在函数声明中告诉您了)。它只是检查您是否正在调用异步方法而不等待它
C)
我不是很确定,如果有人知道这里发生了什么,请帮忙
D)
与A相同,但您等待创建的任务,一切正常。另外,创建一个任务来运行异步操作也是一个非常糟糕的想法
E)
我们是否真的不知道发生了什么事?这确实是您应该使用的async
和Wait
的方式。您的函数正在使用Wait
,这是阻塞。改用wait
。另外,您将任务定义为任务
,但没有返回任何结果-这将无法编译。应该是这样的:
static private async Task<int> Funcation(int x, int y)
{
await Task.Delay(1000);
return x + y; // some int result
}
静态私有异步任务函数(int x,int y)
{
等待任务。延迟(1000);
返回x+y;//一些int结果
}
使用代码“E”来调用。其他调用都不正确
此外,如果您的代码确实不需要延迟,那么这将不是异步的好用例。异步操作应该执行长时间运行或IO绑定的操作。如果您的代码只是执行简单的算术运算,那么就让它成为一种传统的同步方法。B在运行代码时仍然让我感到困惑,因为它看起来是B,而不是异步运行的。它似乎运行同步,因为它阻止当前线程向前移动。在B被称为intill B之后,不会运行任何东西。B是异步还是同步?编译器在函数声明中告诉您,异步方法不等待任何东西,所以它将同步运行,当您像B一样调用它时,它将同步运行“当前方法的执行在调用完成之前继续”我认为这意味着调用是异步的,因为当前的方法将继续。所以我误解了vs告诉我的。我想我明白了。
Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async
Funcation(1, 1);
var handleOne = Task.Run(() => { Funcation(1, 1); }); // Runs Async
await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly
await Funcation(1, 1); //awaits correctly
static private async Task<int> Funcation(int x, int y)
{
await Task.Delay(1000);
return x + y; // some int result
}