2016-12-15 14 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

'async'は"マルチスレッド "を意味しません。 asyncが何をするのかについては、私の[intro to 'async'](http://blog.stephencleary.com/2012/02/async-and-await.html)の記事を見てください。 –

+0

@StephenClearyありがとう、記事は非常に素晴らしく、理解しやすいです – mjb

答えて

3

キーワードasyncは実際にはあまり効果がありません。あなたのコードからそれを削除し、あなたのコードはまったく同じように動作します。

asyncは何をしますか?

  • それは具体的には、あなたがターンでawaitキーワード
  • を使用することができ、それはメソッドの本体が存在しているawait Sに基づいて、変換されることを意味し、メソッドの内側で有効な何変更このメソッドの本体にあります。
  • メソッドが値を返す場合、メソッドはまたTaskに戻り値をラップするように変換されます。あなたがa)は、あなたのメソッド本体内の任意のawait秒を持っていないと、b)は、void返す場合

しかし、その後、特別なことは何も達成されません。コンパイラの警告はこれについて明確にしようとしています - メソッドがない場合は、awaitは意味がありません。 awaitは、この機能のより重要な部分です。

0

あなたがキーワードasyncであなたの方法(ときWork1、WORK2、WORK3)を指定したが、これらのメソッド内のコードのどれもが、非同期呼び出しを呼び出すためにawait演算子を使用していません。

+0

このコードは非同期に実行されますが、結果を待たずに実行されます。 – MistyK

0

はい、あなたのコードはおそらくマルチスレッドを使用します。ただし、asyncというキーワードを削除しただけでもそれが可能です。なぜそこにあるのか説明していないので、削除することをお勧めします。

あなたは非同期で/待つパターンをしたい場合は、Task.Delay()を使用することができますが、私はあなたが/それを使用する前に待つ非同期で続きを読むことをお勧め:

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

あなたが示す方法で「async」キーワードを使用していましたWork1()、Work2()、およびWork3()メソッドは非同期に実行されますが、 'await'キーワードは使用していません.Synchronouslyとして実行します。非同期に実行する場合は '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

関連する問題