C#/ XAMLのWindows 8アプリケーションでは、非同期メソッドからawaitableメソッドを呼び出したい場合があります。
実際にこれを置き換えるのは正しいですか:
public async Task<string> MyCallingMethod()
{
string result = await myMethodAsync();
return result;
}
これで :
public string MyCallingMethod()
{
Task.Run(async () => {
string result = await myMethodAsync();
return result;
});
}
私にとっての利点は、待つことなくMyCallingMethodを使用できることですが、これは正しいですか?これは、非同期メソッドにrefパラメーターを持たせることができないため、MyCallingMethodのrefパラメーターを渡す場合に有利です。
非同期ではない方法では、タスクを非同期的に開始し、結果を待つことはできません。
public void MyCallingMethod()
{
Task t = myMethodAsync();
}
または、タスクの終了後に呼び出されるContinueWithイベントハンドラーをアタッチできます。
public void MyCallingMethod()
{
myMethodAsync().ContinueWith(
result =>
{
// do stuff with the result
});
}
または、タスクから結果を同期的に取得できます。
public string MyCallingMethod()
{
string result = myMethodAsync().Result;
return result;
}
UIスレッドを使用している場合、そのようなことをしようとすべきではありません。スレッドをブロックすることになるからです。代わりに、ref
パラメーターを回避する必要があります。たとえば、変更する値を含む単純なクラス型のパラメーターを受け入れる必要があります。
これを行わないもう1つの理由は、ラムダがエンクロージングメソッドのref
パラメーターにアクセスできないため、ref
パラメーターを使用できないことです。
しかし、あなたが本当にこれをやりたいのなら(再び、あなたはすべきではないと本当に思う)、あなたはTask
の結果を得る必要があるでしょう。何かのようなもの:
public string MyCallingMethod()
{
var task = Task.Run(async () =>
{
return await myMethodAsync();
});
return task.Result;
}