2015-06-13 125 views
-2

为什么B运行同步? Vs说:“因为这个调用没有被等待,所以在调用完成之前继续执行当前的方法。” ;函数运行同步时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(); 
} 

回答

1

Funcation使用async关键字但在它的身上什么也没await所以它总是会同步运行。也Function甚至没有编译。

A)

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

在这里你创建一个线程,该线程调用Function所以它是asynchrounsly,因为它是在另一个线程上运行。

B)

Funcation(1, 1); 

Function被标记async但不await ED其中时被调用。在这种情况下,编译器不检查Function是否在其本体中使用await(它已经在函数声明中告诉过你)。它只是检查你是否正在调用异步方法而不等待它。

C)

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

我真的不知道在这一个,如果有人知道发生了什么在这里,请帮助。

d)

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

一样一个但你等待所创建的任务,一切都OK。创建一个任务来运行异步操作也是一个非常糟糕的主意。

E)

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

我们真的除了别的事情发生?这真的是你应该使用asyncawait的方式。

+0

B仍然是我困惑的时候,我运行它的代码似乎B,因为它是,不运行异步。它似乎运行同步,因为它阻止当前线程向前移动。在B被称为直到B完成之后没有任何运行。对于B,它运行异步还是同步? –

+0

编译器在函数声明中告诉你,你的异步方法不会等待任何事情,所以它会同步运行,当你像** B **那样调用它时,它将同步运行 – dotctor

+1

“在调用之前继续执行当前方法完成“我认为这意味着呼叫是异步的,因为当前的方法将继续。 K所以我误解了什么是vs告诉我的。我想我明白了。 –

0

您的功能正在使用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绑定的事情。如果你的代码只是执行简单的算术,那么就把它做成传统的同步方法。