1

メッセージが徐々に表示され、数秒後に再びフェードするUserControlがあります。このコントロールはbackgroundWorkerを使用します。それは大丈夫です。ただし、メッセージを次のように表示するメソッドにオーバーロードを追加する必要があります。

ShowMessage(string message, bool waitToHide) { .. }

ここで、呼び出しスレッド(UIスレッド)に上記のメソッドを待機させるための最良の方法を知る必要があります。


内部backgroundWorkerが完了したことを呼び出しスコープに通知するイベントを発生させようとしましたが、このメソッドはメインアプリケーションで頻繁に使用されているため、多くの統合スコープをいくつかの分散スコープに分割する必要があります。

{
    // before code snippet..
    messageDisplayer1.ShowMessage("test", true);
    // after code snippet..
}

になります:

{
    // before..
    messageDisplayer1.ShowMessage("test", true);
}

void messageDisplayer1_Done()
{
    // after..
}
4

1 に答える 1

3

非同期 CTP を使用せずに .NET 3.5 または .NET 4 に固執する必要がある場合、コードの分割を避けることはできないと思います (コードをDoEventsで散らかしたい場合を除きますが、これは絶対にお勧めできません)。

一方、非同期拡張機能(.NET 4 用の CTP または .NET 4.5 に含まれるバージョン) を使用すると、次のようなことができます。

{ 
    // before code snippet.. 
    await messageDisplayer1.ShowMessage("test", true); 
    // after code snippet.. 
} 

次に、コンパイラは、「コード スニペットの後」を別のコード ブロック (継続) に自動的に配置します。これは、ShowMessage が完了を通知するとすぐに実行されます。その間、制御は Windows メッセージ ループに戻され、プログラムの UI は応答したままになります。

于 2012-04-04T08:09:12.027 に答える