2017-02-20 15 views
-1

私のコードが正しくコンパイルされますが取得警告がこの非同期メソッドは「待つ」演算子を欠いており、同期的に実行されますC#のWinフォームは:非同期で実行時間の長い操作が

と呼ばれて待っています。 'await'演算子を使用して、ノンブロッキングAPI呼び出し、 または 'await Task.Run(...)'を待機し、バックグラウンドスレッドでCPUバインド処理を行うことを検討してください。

private async void Form1_Load(object sender, EventArgs e) 
    { 
     //await longRunningRoutine(); 

     await Task.Run(async() => 
     { 
      await longRunningRoutine(); ; 
     }); 
     label1.Text = "hello test"; 

    } 

    public async Task longRunningRoutine() 
    { 
     await Task.Delay(10000); 
    } 

ので、私は警告を取得していますそのために私のコードでは不足であるものを私に教えて? この問題を解決する方法。ありがとう

+0

'longRunningRoutine()は実際に何をしますか? –

+2

sleepを 'await Task.Delay(10000);に置き換えてください。 – Equalsk

+0

あなたの非同期メソッド(longRunningRoutine)は演算子を待っていません...同期して実行されます... – Evk

答えて

2

を使用して非同期的にスリープを呼び出す必要があり、この警告を解決するには
それを実行するためのTask作成し、そのタスク待つ:

private async void Form1_Load(object sender, EventArgs e) 
{ 
    await Task.Run(() => longRunningRoutine()) 
} 

public void longRunningRoutine() 
{ 
    System.Threading.Thread.Sleep(10000); 
} 
1

警告は、非同期にlongRunningRoutineを呼び出していると言われていますが、このメソッドには非同期要求のタイプはありません。あなたが同期このメソッドを呼び出す必要があるか、あなたは(あなたがそうでない)待つためのawaitableメソッドを持っていない場合は、あなたが持っているでしょうTask.Delay

+0

OPは実際にはSleep()を呼び出すことに興味がないと思います。ちょうど同期操作をシミュレートするのにちょっと時間がかかります。 –

+0

私はあなたに同意します(私はあなたの答えをアップupvoted)しかし、彼はなぜ彼がそのエラーを取得しているので、私は説明を書いて、それを解決するための2つの可能な方法(3つ目はあなたによってすでに投稿されています) – Tinwor

1

あなたlongRunningRoutine方法はすでに非同期ですが - ので、あなただけの余分なスレッドを無駄にTask.Runを削除することができ

private async void Form1_Load(object sender, EventArgs e) 
{ 
    await longRunningRoutine(); 
    label1.Text = "hello test"; 
} 

その後、接尾辞を..Asyncという接尾辞を付けて改名することをお勧めします。コードを読むときには数秒間の節約になります。

関連する問題