私の一般的な質問はこれです:同期ソリューションのように、まだ明確でわかりやすい非同期コードをどのように記述しますか?
私の経験では、BackgroundWorkerのようなものを使用して同期コードを非同期にする必要がある場合、全体的な意図とアクティビティの順序を表す一連の簡単なプログラムステートメントがなくなり、代わりに「 Done "イベントハンドラー。それぞれが次のBackgroundWorkerを開始し、追跡が非常に難しいコードを生成します。
私はそれがあまり明確ではないことを知っています。より具体的なもの:
WinFormsアプリケーションの関数が、いくつかのAmazon EC2インスタンスを起動し、それらが実行されるのを待ってから、それらがすべてSSH接続を受け入れるのを待つ必要があるとします。擬似コードの同期ソリューションは次のようになります。
instances StartNewInstances() {
instances = StartInstances()
WaitForInstancesToBecomeRunning(instances)
WaitForInstancesToAcceptSSHConnection(instances).
return (instances)
}
それはすばらしい。何が起こっているかは非常に明確であり、プログラムアクションの順序は非常に明確です。コードとフローの理解を妨げるホワイトノイズはありません。本当にそのようなコードになりたいです。
しかし、実際には、同期ソリューションを使用することはできません。これらの各関数は長時間実行でき、それぞれが次のようなことを行う必要があります。UIを更新し、タイムアウトを超えているかどうかを監視し、次のようになるまで定期的に操作を再試行します。成功またはタイムアウト。つまり、フォアグラウンドUIスレッドを続行できるように、これらのそれぞれがバックグラウンドで発生する必要があります。
しかし、BackgroundWorkerのようなソリューションを使用する場合、上記のようなプログラムロジックを簡単に実行できるようにはならないようです。代わりに、UIスレッドからバックグラウンドワーカーを起動して最初の機能を実行し、ワーカースレッドの実行中にUIスレッドがUIに戻る場合があります。終了すると、その「完了」イベントハンドラーが次のバックグラウンドワーカーを開始する場合があります。終了すると、その「完了」イベントハンドラーが最後のBackgroundWorkerを開始する可能性があります。つまり、プログラムフロー全体を理解するには、DoneEventハンドラーの「トレイルをたどる」必要があります。
a)UIスレッドが応答するようにする、b)非同期操作でUIを更新できるようにする、そして最も重要なこととしてc)プログラムを一連の連続したステップとして表現できるようにする(これまでのように)より良い方法が必要です。上に示した)誰かが結果のコードを理解できるように
ありとあらゆる入力をいただければ幸いです。マイケル