2009-07-20 3 views
2

少年質問のビットでコードを実行します。ボタンクリックイベントでこれをどのように達成するのですか?Winformsのは</p> <p>私はWinformsのアプリでは、長時間実行コードは独自のスレッドで実行する必要があることを実感...別のスレッド

私は、現在のフォームを半透明のモーダルダイアログフォームで同時に重ね合わせることができるように、UIスレッドを解放するためにこれを行いたいと思います。私はaleadyが独自のボタンクリックイベントで完璧に動作する、中心にあるきちんとしたローディングGIFを持つモーダルダイアログフォームを作成しました。

私はこのメソッドを選択した理由は、(1)コードの実行中にフォームとのユーザーのやりとりをブロックしたい、(2)処理が進行中であることを示す私はコードの特定の部分がどれくらい長く実行されるかを判断する方法を知らないので、不定のローディングインジケータgifを選択します。

また、個別のスレッドでコードを実行するトピックについては、これはのコードのコードに適用されませんか、特に長時間実行されるコードにのみ適用されますか?

この問題については本当に助かりました。ありがとうございました!

答えて

8

最も簡単な方法の1つは、BackgroundWorkerコンポーネントを使用することです。フォームにBackgroundWorkerを追加し、​​イベントのイベントハンドラを追加し、そこから長期実行関数を呼び出します。 BackgroundWorkerコンポーネントのRunWorkerAsyncメソッドを呼び出すことで、ボタンクリックイベントハンドラで開始できます。

操作がいつ行われるかを知るには、RunWorkerCompletedイベントのハンドラを設定します。 (フレドリックはすでにのBackgroundWorkerを説明したように)

private void Button_Click(object sender, EventArgs e) 
{ 
    myBackgroundWorker.RunWorkerAsync(); 
} 

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // long-running operation here; will execute on separate thread 
} 

private void myBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // operation is ready 
} 
+0

ありがとうFredrik。 2つのボタン(クリック)のうちの1つから呼び出せる長時間実行される操作が2つあった場合、2つのBackgroundWorkerコンポーネントをフォームに追加する必要があります...はい? – Shalan

+0

@Shalan:これは最も簡単なアプローチです。 –

+0

ありがとう、Fredrik – Shalan

3

私はあなたの質問の後半にお答えします:タスクがある場合を除き

いいえ、それは別のスレッドにタスクを移動しても意味がありません。長時間走っている。

タスクを別のスレッドで実行すると、余分なオーバーヘッドが常に発生します。スレッドを開始してタスクの完了を処理するには、UIスレッドの時間がさらにかかることがあります。それから、最初にタスクを実行するだけです。

プログラミング手法のように、特定の状況のコストとメリットを検討する必要があります。

+0

ありがとう、アンドリュー。それは本当に確かなアドバイスです...私はそれを覚えているでしょう! – Shalan

2

私は自分の経験に基づいて、質問の第2の部分に答えようとします。 あなたは、一般的にのみ、3つの状況でスレッドを使用します。長時間実行でシステムコール(ファイル/ソケットIOなど)

  • 上の時間の顕著な期間にブロックします操作に

    • UI応答性の喪失が望ましくない操作である。

    • 複数の長時間実行操作では、マルチコア環境を利用することが望ましい。

    Andrew Shepherd氏によれば、スレッドの使用にはオーバーヘッドがあります。 スレッドは物事を劇的に複雑にします。スレッディングのためにスレッドしないでください。

  • +0

    あなたにもありがとう、ニック。あなたとAndrewの助言は本当に洞察力があり、コードをどのように構造化するか再評価してくれます。しかし、長期的なものとして解釈されるものは何ですか?これを判断するためのベンチマークがありますか?つまり、マシンの絶対ロバを使って開発することができます。これは、稲妻のようなPCを持つ可能性のある同じアプリケーションのユーザーと比べます。助言?? – Shalan

    +0

    @Shalan:私は通常、計算の複雑さの点で長時間実行することを定義します。私は、それぞれが多項式時間(またはそれより遅い)で合理的なサイズのデータ​​セットを実行するならば、並列で計算できる複数の計算があるときはいつでもスレッドを使う良いケースがあると言えます。もう1つのケースはI/O操作(特にソケットI/O)であり、論理的に遅延して非同期に実行できるものがあればよいはずです。 スレッドの使用を見つけるのが難しくありません - ソフトウェアを設計するときに、スレッド化の理想的な候補が明らかになることがよくあります。 – Nick

    +0

    あなたの入力に感謝、ニック! – Shalan

    関連する問題