void async
メソッドが完了するのを待つ方法はありますか?例えばvoid非同期メソッドを待つ
、私は以下のような機能を持っている:
async void LoadBlahBlah()
{
await blah();
...
}
今、私はすべてがどこかに続行する前にロードされていることを確認します。
void async
メソッドが完了するのを待つ方法はありますか?例えばvoid非同期メソッドを待つ
、私は以下のような機能を持っている:
async void LoadBlahBlah()
{
await blah();
...
}
今、私はすべてがどこかに続行する前にロードされていることを確認します。
ベストプラクティスすることはできませんあなたがすることができない、本当にawait
void
機能blah()
戻り
オブジェクトの型であることが火災の場合にのみ機能async void
をマークし忘れていますメソッドを使用する場合は、待つ必要がある場合は、async Task
とマークする必要があります。その後、場合
それでも待つしたい場合は、最善の解決策はasync Task
を使用することですので、await Task.Run(() => blah())
あなたがasync Task
にあなたの関数のシグネチャを変更することができるなら、あなたは、コードを使用することができますが、あなたは本当に手動で何もする必要はありませんhere
を提示し、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
ようにそれを包みます。いくつかの理由でasync void
を回避する必要がありますが、その1つは合成可能です。
方法はは、終了しようとしているとき、あなたはメソッド信号を持っているSemaphoreSlim
を使用することができ、(例えば、それはイベントハンドラです)Task
を返すことができない場合。 finally
ブロックでこれを行うことを検討してください。
AutoResetEventを実行して、関数を呼び出し、AutoResetEventを待機させてから、AutoResetEventが完了したことを知らせると、そのイベントを非同期voidの内部に設定します。
あなたはまた、
は私がLoadBlahBlah '待つしたいあなたのボイド非同期から返すタスクを待つことができます()'ではなく '何とか()空のメソッドが行う残念ながら、非同期(async)' – MBZ
@MBZ更新答え – Mayank
を終了します実行を一時停止しない(非同期タスクメソッドとは異なります) – ghord