2016-12-10 7 views
1

私はWindows Phone環境でapi呼び出しを行う必要がある関数から文字列を返すだけです。私はタスク、ちょうど文字列を返すしたくない。この非同期関数呼び出しを停止し、代わりに単純な値を返します。

私は単純に実行しなければならない関数を呼び出す正確な場所で常にawaitを使用することなく、関数から値を取得する方法を知らないだけです(この非同期/待機のことは無意味です)。

私はこのような何かを得ることができる方法を私に説明してください:もちろん

var result = LoadDataAsync().GetAwaiter().GetResult(); 

:あなたはちょうどこれを実行したいタスクを返すすべての関数にしようとしていると仮定すると、

string TheStringIWant(someParameter) 
{ 
string result = await LoadDataAsync(); 
return result; 
} 

答えて

1

申し訳ありませんが、私はあなたに "ハードな愛"の答えを与えるつもりです。

私はWindows Phone環境でAPI呼び出しを行う必要がある関数から文字列を返すだけです。私はタスク、ちょうど文字列を返すしたくない。

あまりにも悪いです。 正しいソリューションは、モバイルプラットフォームでTask<string>,、特にを返すことです。他の解決策はちょうどハックになるでしょう。

私は単純に実行しなければならない関数を呼び出す正確な場所で常にawaitを使用することなく、関数から値を取得する方法を知らないだけです(この非同期/待機のことは無意味です)。

まったく無意味ではありません。 async/awaitは、UIを応答性の高いものにします。これはが必要ですあなたのアプリがWindowsストアで受け入れられるようにします。

+0

私はそれが好きです:)それでは、関数が何かを返す必要がある限り、非同期関数を呼び出してその前にawaitキーワードを置くとどうなりますか?あなたは? – Ravior

+0

@Ravior:一般的にはyesです。スレッドは 'await'を実行したときに他のことを自由に行うことができます(ユーザー入力に応答するなど)。私は参考になるかもしれない['async'イントロ](http://blog.stephencleary.com/2012/02/async-and-await.html)ブログ記事を持っています。 –

+0

これは非常に助けになります。どうもありがとうございます! – Ravior

0

を同期を強制的に実行するのではなく、非同期タスクが完了するまで待ってから結果を返すようにコンパイラに指示します。機能的には

var result = await LoadDataAsync(); 

と同等です。この構文はすべて、非同期キーワードを使用してメソッドに注釈を付けることを許可しています。あなたはをやります。はどちらか一方を待つ必要があります。非同期に実行されるメソッドを呼び出す場合、その関数が完了してデータを返すのを待つために何かをする必要があります。そうしないと、不正なデータが取得されます。

0

非同期メソッド(Wait()または.Resultのいずれか)でブロッキング呼び出しを行うと、呼び出し元のメソッドのSynchronizationContextがnullでない場合にデッドロックが発生する危険性があります。非同期メソッドは、呼び出し元メソッドの同期コンテキストで継続をスケジュールしようとしますが、呼び出しメソッドは非同期メソッドの完了時にブロックされるため、デッドロックになります。

デッドロックを保証する1つの方法は、この非同期呼び出しをバックグラウンドスレッドにプッシュすることです。 Task.Runによって。バックグラウンドスレッドにはSynchronizationContextがないため、デッドロックは発生しません。

のような何か:

var result = Task.Run(async() => await LoadDataAsync()).Result; 

PS。 Resultプロパティの前にWait()を呼び出す必要はありません。結果は、タスクが完了するまでスレッドをブロックします。

関連する問題