2016-09-08 10 views
0

メインスレッドよりも時間がかかる非同期タスクがあります。メインスレッドは非同期タスクの前に終了し、非同期タスクの結果が表示されません。たとえば、非同期タスクが挿入するDBレコードが表示されません。ここでC#で非同期タスクが完了するまでメインスレッドを待機させる方法

が私のコードである

Frameworkの4.5

public void Load(int id) 
    { 
     Task asynctask1; 
     asynctask1 = CallWithAsync(id); // this is async task 
     task2(); // main thread 
     task3(); // main thread 

    } 
    private async static Task CallWithAsync(int id) 
    { 
     string result = ""; 
     try 
     { 
      result = await InsertDataAsync(id); 
     } 
     catch (Exception ex) 
     { 
      //do some error logging 
     } 
     //return result; 

    } 
    static Task<string> InsertDataAsync(int id) 
    { 
     return Task.Run<string>(() => 
     { 
      return InsertData(id); 
     }); 
    } 
    static string InsertData(int id) 
    { 

     try 
     { 

      System.Threading.Thread.Sleep(5000);//we have some code here which takes longer 
      //code to insert DB record 

     } 
     catch (Exception ex) 
     { 
      //do some error logging 
     } 


     return "success"; 

    } 


    public void task2() 
    { 
     //some thing 
    } 
    public void task3() 
    { 
     //some thing 
    } 
+1

voidのを返し、注意してください 'asynctask1を待ちますか;'? – zerkms

+0

@zerkms 'Load'メソッドは' async'としてマークされていないので、 'await'はこの場合オプションではありません。 –

+0

私は通常、WaitHandleを使用します:https://msdn.microsoft.com/en-us/library/58195swd(v=vs.110).aspx – jdweng

答えて

2

タスクは、メソッドの最後に完了するのを待ち:

public void Load(int id) 
{ 
    Task asynctask1; 
    asynctask1 = CallWithAsync(id); 
    task2(); 
    task3(); 
    asynctask1.Wait(); // wait for async task to complete 
} 

を場合にもawaitキーワードを使用することができますLoadメソッド自体にasyncキーワードを追加します。

+0

私はこれを試しましたが、実行はwait()を超えていません。 – Abbi

+0

@Abbi質問や完全なコードで提供したサンプルコードで試してみませんか? 'CallWithAsync'が完了するまで、実行は続行されません。 –

+0

はい私は完全なコードを実行していました。私はロードメソッドAsyncを作って、それは働いています。みなさん、ありがとうございました。 – Abbi

0

ロードを非同期にしてコールを待ちますか?あなたは非同期のvoidメソッドを持つことができますが、非同期のタスクであり、呼び出しチェーンをさらに待っている方が良いでしょう。

public async void Load(int id) 
{ 
    await CallWithAsync(id); // this is async task 
    task2(); // main thread 
    task3(); // main thread 
} 
0

task2()task3()の呼び出しの後にasynctask1に待っていることでLoad方法asyncしてください。 Load方法は今Task代わり

public async Task Load(int id) 
{ 
    Task asynctask1; 
    asynctask1 = CallWithAsync(id); // this is async task 
    task2(); // main thread 
    task3(); // main thread 
    var result = await asynctask1; 
    Console.Writeline(result); //verify returned value of asynctask1 task 
} 

private async static Task<string> CallWithAsync(int id) 
{ 
    string result = ""; 
    try 
    { 
     result = await InsertDataAsync(id); 
    } 
    catch (Exception ex) 
    { 
     //do some error logging 
    } 
    return result; 

} 
関連する問題