2012-11-29 20 views
80

void asyncメソッドが完了するのを待つ方法はありますか?例えばvoid非同期メソッドを待つ

、私は以下のような機能を持っている:

async void LoadBlahBlah() 
{ 
    await blah(); 
    ... 
} 

今、私はすべてがどこかに続行する前にロードされていることを確認します。

答えて

97

ベストプラクティスすることはできませんあなたがすることができない、本当にawaitvoid機能blah()戻り

オブジェクトの型であることが火災の場合にのみ機能async voidをマークし忘れていますメソッドを使用する場合は、待つ必要がある場合は、async Taskとマークする必要があります。その後、場合

それでも待つしたい場合は、最善の解決策はasync Taskを使用することですので、await Task.Run(() => blah())

51

あなたがasync Taskにあなたの関数のシグネチャを変更することができるなら、あなたは、コードを使用することができますが、あなたは本当に手動で何もする必要はありませんhere

2

を提示し、awaitキーワードはblah()復帰するまで、機能の実行を一時停止します。

private async void SomeFunction() 
{ 
    var x = await LoadBlahBlah(); <- Function is paused 
    //do more stuff when LoadBlahBlah() returns 
} 

private async Task<T> LoadBlahBlah() 
{ 
    return await blah(); <- function is paused 
} 

TのでLoadBlahBlah()void

+0

は私がLoadBlahBlah '待つしたいあなたのボイド非同期から返すタスクを待つことができます()'ではなく '何とか()空のメソッドが行う残念ながら、非同期(async)' – MBZ

+0

@MBZ更新答え – Mayank

+5

を終了します実行を一時停止しない(非同期タスクメソッドとは異なります) – ghord

17

ようにそれを包みます。いくつかの理由でasync voidを回避する必要がありますが、その1つは合成可能です。

方法は、終了しようとしているとき、あなたはメソッド信号を持っているSemaphoreSlimを使用することができ、(例えば、それはイベントハンドラです)Taskを返すことができない場合。 finallyブロックでこれを行うことを検討してください。

2

AutoResetEventを実行して、関数を呼び出し、AutoResetEventを待機させてから、AutoResetEventが完了したことを知らせると、そのイベントを非同期voidの内部に設定します。

あなたはまた、

関連する問題