2016-12-15 41 views
3

我的程序有以下聲明3個警告:這種異步方法缺乏「等待」運營商和運行同步

這種異步方法缺乏「等待」運營商和將同步運行。 考慮使用'await'操作符來等待非阻塞API調用 或'await Task.Run(...)'在後臺線程上執行CPU綁定工作。

什麼是警告試圖告訴我?我該怎麼辦?

這是我的代碼:它使用多線程運行嗎?

static void Main(string[] args) 
{ 
    Task task1 = new Task(Work1); 
    Task task2 = new Task(Work2); 
    Task task3 = new Task(Work3); 

    task1.Start(); 
    task2.Start(); 
    task3.Start(); 

    Console.ReadKey(); 
} 

static async void Work1() 
{ 
    Console.WriteLine("10 started"); 
    Thread.Sleep(10000); 
    Console.WriteLine("10 completed"); 
} 

static async void Work2() 
{ 
    Console.WriteLine("3 started"); 
    Thread.Sleep(3000); 
    Console.WriteLine("3 completed"); 
} 

static async void Work3() 
{ 
    Console.WriteLine("5 started"); 
    Thread.Sleep(5000); 
    Console.WriteLine("5 completed"); 
} 
+2

「異步」並不意味着「多線程」。請參閱我的[inync to'async'](http://blog.stephencleary.com/2012/02/async-and-await.html)文章,瞭解'async'的作用。 –

+0

@StephenCleary謝謝,文章非常好,易於理解 – mjb

回答

3

關鍵字async本身並沒有多大作用。將其從您的代碼中刪除,您的代碼將完全相同。

async是做什麼用的?

  • 它改變有什麼方法內有效,特別是它可以讓你使用await關鍵字
  • 反過來,它意味着該方法的身體就會轉化的基礎上,await S中的存在在方法的主體中。
  • 如果該方法返回一個值,該方法也將轉換爲將返回值包裝在Task中。

但是,如果你一)不要有任何await在你的方法主體和b)void返回,然後沒有什麼特別將得以實現。編譯器的警告確實試圖清楚這一點 - 沒有任何await的方法只是簡單的沒有意義。 await s是此功能中更重要的部分。

0

你指定你的方法(工作1,WORK2,Work3)與關鍵字async但沒有你的代碼的這些方法中使用await運算符調用異步調用。

+0

此代碼將異步運行,但不會等待結果。 – MistyK

0

是的,你的代碼可能會使用多線程。但是,如果您剛剛刪除了async關鍵字,它仍會這樣做。由於你沒有解釋爲什麼它在那裏,我建議刪除它。

如果你想要一個異步/ AWAIT模式,您可以使用Task.Delay(),但我建議你閱讀更多關於異步使用前/等待:

static async void Work3() 
{ 
    Console.WriteLine("5 started"); 
    await Task.Delay(5000); 
    Console.WriteLine("5 completed"); 
} 
0

您已經使用「async」與方法關鍵字指示Work1(),Work2()和Work3()方法是異步執行的,但是你沒有使用'await'關鍵字。所以它同步執行。如果你想異步執行,使用'await'關鍵字。

static async void Work1() 
{ 
    Console.WriteLine("10 started"); 
    await Task.Delay(10000); 
    Console.WriteLine("10 completed"); 
} 

static async void Work2() 
{ 
    Console.WriteLine("3 started"); 
    await Task.Delay(3000); 
    Console.WriteLine("3 completed"); 
} 

static async void Work3() 
{ 
    Console.WriteLine("5 started"); 
    await Task.Delay(5000); 
    Console.WriteLine("5 completed"); 
} 
+0

此代碼將異步運行,但不等待結果。 – MistyK