2012-02-15 7 views
2

私はこの例で取り組んでいますが、私はコールバックとスレッドをメッシュすることができません。 私が欲しいのはこれです。
1)ボタンを押します 2)実行中のプログレスバーを開始します 3)新しいスレッドを呼び出して長時間実行するプロセス 4)長時間実行されているプロセスでコールバックすると、進行状況バーが停止します。コールバックを使用したスレッド化の例は機能しません。

私は何かを持っています... DoSomethingInThreadのコールバックパラメータはnullになりますが、 StopProgressBar()はProgressBarコントロールで動作するため、静的にすることはできません。

static bool done; 
    static readonly object locker = new object(); 
    static ParameterizedThreadStart threadStarter = new ParameterizedThreadStart(DoSomethingInThread); 
    private Thread workerThread = new Thread(threadStarter); 
    public delegate void StopProgressBarCallback() 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     StartProgressBar(); 
     workerThread.Start(); 
    } 

    static void DoSomethingInThread(object callback) 
    { 
     StopProgressBarCallback stopper = callback as StopProgressBarCallback; 
     lock (locker) 
     { 
      Thread.Sleep(5 * 1000); 
     } 
     stopper(); 
    } 

    private void StartProgressBar() 
    { 
     progressBar1.MarqueeAnimationSpeed = 30; 
     progressBar1.Style = ProgressBarStyle.Marquee; 
    } 

    public void StopProgressBar() 
    { 
     progressBar1.Style = ProgressBarStyle.Continuous; 
    } 

答えて

4

backgroundworkerクラスを見てください、それがでグリップを得ることがより簡単にあなたがやろうとしているものに適しており、全体の多くです!

一般的に、スレッドインスタンスを「新しくする」べきではありません。バックグラウンドワーカーであるthread poolを使用する方が良いでしょう。また、.net 4の場合は、スレッド並列ライブラリのtaskオブジェクトを使用することをお勧めします。

+1

BackgroundWorkerクラスは非常に簡単で、初めての作業でした。提案していただきありがとうございます。 – KickinMhl

関連する問題