長時間実行計算MSDNの例を使用したシングルスレッドアプリケーションによると、 1つのスレッドでレスポンシブGUIを作成する可能性があります。Dispatcher
オブジェクトのおかげで、作業項目の優先度を設定できます。
私の質問は、これが可能な場合、バックグラウンドスレッドで単純なタスク(シングルコアCPUが1つしかない場合)を実行する必要があるのはどのような意味ですか?
ありがとう
長時間実行計算MSDNの例を使用したシングルスレッドアプリケーションによると、 1つのスレッドでレスポンシブGUIを作成する可能性があります。Dispatcher
オブジェクトのおかげで、作業項目の優先度を設定できます。
私の質問は、これが可能な場合、バックグラウンドスレッドで単純なタスク(シングルコアCPUが1つしかない場合)を実行する必要があるのはどのような意味ですか?
ありがとう
基本的に、この例では、「できるだけ多くの素数を見つける」という1つのタスクを、非常に低い優先度で実行される多数の高速実行の個々のステップに分割しているため、ユーザーとの対話を中断する可能性はほとんどありません。窓。
私が感じる1つの欠点は、プログラマーがタスクを多くの小さなステップに分割することを余儀なくされることです。これは、迅速に実行できることを保証する必要があります。これらのタスクの1つが実行されている場合、そのタスクの全期間にわたってUIがブロックされます。ファイルのダウンロードを検討してください。FTPサイトに接続する1つの手順を実行すると、20秒以上かかる場合があり、その間UIはフリーズします。
これを、ダウンロード全体を一度に実行し、更新をUIスレッドにマーシャリングする適切なスレッドと比較してください。シングルコアマシンでも、これは合理的なユーザーエクスペリエンスを提供するはずです。
次の欠点は、シングルスレッドでコードを実行していることです。これは思ったほど素晴らしいものではありません。小さな個々のタスクがキューに入れられる方法のために、他のタスク(ウィンドウのメッセージキューにプッシュされたもの)は、それらの間でジャンプして実行する機会があります。特別なタスクが使用する状態が適切に分離されていない場合、スレッドの問題のように見える問題が発生する可能性がありますが、さらに悪いことに、すべてのアクションが同じスレッドで実行されるため、ロックを使用してこれらの問題から身を守ることはできません。。Application.DoEvents()を使用する場合にも、同様の欠点があります(ただし、ここでは実行できないものを続行できる、さらに厄介なものがいくつかあります)。
したがって、概説した手法は、状況によっては使用できる場合と使用できない場合があります。したがって、バックグラウンドスレッドでコードを実行する、常に適用可能な手法を採用します。
答えは通常、ほとんどの場合同じだと思います。「UIの応答性の高い質問を維持しながら、単一のスレッドを使用する」。あなたは本当にできません。あなたは弾丸を噛み、適切に糸を引くことを学ぶ必要があります。よく考え、状態を分離し、不変性とロックを使用して状態を保護し、必要に応じてスレッド間で呼び出しを適切にマーシャリングします。