.NET 4.0のawaitキーワードの最良の代替方法は何ですか?非同期操作の後に値を返す必要があるメソッドがあります。私はwait()メソッドがスレッドを完全にブロックし、非同期操作が役に立たないことに気付きました。 UIスレッドを解放しながら非同期操作を実行するためのオプションは何ですか?.NET 4.0の代替案を待ち望んでいますか?
10
A
答えて
4
を使用する最も簡単な方法は、インストールするには、おそらく非同期CTPとasync
/await
Task
と.ContinueWith()
- だと思います非同期CTP。私の知る限り、ライセンスは商業的な使用を許可します。コンパイラにパッチを当て、あなたのプロジェクトに含めることができる150kbのDLLが付属しています。
Task
と.ContinueWith()
を使用できます。しかし、それは、例外処理とフロー制御でいくらか努力する必要があるということです。タスクは機能的な構造です。そのため、
ContinueWith()
は、for
ループやtry-catch
ブロックのような必須の構造とうまく混合できません。したがって、async
とawait
が導入されたので、コンパイラが私たちを助けることができます。コンパイラをサポートできない場合(つまり、.Net 4.0を使用している場合)は、TAPを機能フレームワークとともに使用することをおすすめします。 Reactive Extensionsは、非同期メソッドを処理するための非常に優れたフレームワークです。
"reactive extensions tasks"を開始するにはgoogleを使用してください。
1
yield
コルーチンでawait
のような動作を実装できますが、これは4.5以外のコードで使用しています。そして、あなたがYieldInstruction
のいくつかの実装を必要とする(TaskCoroutine
AEタスクを処理する)、この方法(擬似コード)、それを使用
public abstract class YieldInstruction
{
public abstract Boolean IsFinished();
}
:あなたは非同期に実行するメソッドから取得されYieldInstruction
クラスが必要
public IEnumerator<YieldInstruction> DoAsync()
{
HttpClient client = ....;
String result;
yield return new TaskCoroutine(() => { result = client.DownloadAsync(); });
// Process result here
}
ここでは、命令の実行を処理するスケジューラが必要です。
for (Coroutine item in coroutines)
{
if (item.CurrentInstruction.IsFinished())
{
// Move to the next instruction and check if coroutine has been finished
if (item.MoveNext()) Remove(item);
}
}
あなたはまた、あなたが適切なタイミングでコルーチンを更新している場合は任意のInvoke
呼び出しを避けることができますWPFやWinFormsのアプリケーションを開発します。また、あなたの人生をより簡単にするためにアイディアを広げることもできます。サンプル:
public IEnumerator<YieldInstruction> DoAsync()
{
HttpClient client = ....;
client.DownloadAsync(..);
String result;
while (client.IsDownloading)
{
// Update the progress bar
progressBar.Value = client.Progress;
// Wait one update
yield return YieldInstruction.WaitOneUpdate;
}
// Process result here
}
関連する問題
- 1. DoCmd.ApplyFilterの代替案または提案?
- 2. 代替案
- 3. パーズクラウドコードの代替案
- 4. Coldfusion:CFDocument PDF代替案
- 5. Camel JPA @代替案
- 6. 私は待ち望んでいるメソッドでvoidを待つことができません
- 7. Rails 3オートコンプリート - 代替案の提案?
- 8. Microsoft.Jet.OLEDB.4.0に代替する
- 9. slowAESはCBC/PKCS7の代替案では動作しませんか?
- 10. GileadとRequestFactoryの代替案
- 11. AJAXコントロールツールキットの代替案ValidationCallOutExtender
- 12. オプションタイプの代替案C#
- 13. R dplyrサブセットの代替案
- 14. Apache Tilesの代替案
- 15. GLUTハスケルの代替案?
- 16. ideatorrentオープンソースの代替案
- 17. マルチスレッドの代替提案
- 18. ASP.NETメンバーシップの代替案
- 19. コードレビューTFS 2012の代替案?
- 20. jqueryの代替案msgbox
- 21. バックグラウンド固定の代替案
- 22. は十分に良いWSAASyncSelectですか?代替案を提案できますか?インディは良いですか?
- 23. ダスクバッグはすべてのコアを使用していませんか?代替案?
- 24. SKPayment paymentWithProductIdentifier推奨されていません。代替案?
- 25. .NET CF ComboBoxにはDropDownイベントがありません。その代替案は何ですか?
- 26. 構成ルールエンジン - 代替案?
- 27. Adobe Animate代替案ClickToGoToWebPage
- 28. .NET 3.5のGetGlobalAsaxTypeの代替ですか?
- 29. Array.mapまたはループの代替案を約束しますか?
- 30. postgresで大量の代替案があります
私はそう思っています。いくつかのコードがありますか? – lboshuizen
.net 4.0をターゲットにしている間にC#5.0でVS2012を使用することは可能ですか? [Using async-await on .net 4](http://stackoverflow.com/questions/9110472/using-async-await-on-net-4)を参照してください。 – CodesInChaos
@CodesInChaos同僚の場合は、:)。 – Dante