2011-01-24 5 views
1

これは私に苦労しています。 事は、私がMIDIにいくつかのメモを果たしているコードを持っているということである、と私はそれを一時停止できるようにしたかったので、私はこのような簡単なフォーム製:Windowsフォームで(効果的に)マルチスレッド化できますか?

namespace Music 
{ 
    public partial class Form1 : Form 
    { 

     static BackgroundWorker _bw = new BackgroundWorker 
     { 
      WorkerSupportsCancellation = true 
     }; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (!Playing) 
      { 
       Playing = true; 
       _bw.DoWork += Start_Playing; 
       _bw.RunWorkerAsync("Hello to worker"); 
      } 
      else 
      { 
       Playing = false; 
       _bw.CancelAsync(); 
      } 
     } 

     static void Start_Playing(object sender, DoWorkEventArgs e) 
     { 
      //Plays some music 
     } 
    } 
} 

をそして、私がクリックしたときに、それが再生を開始し、しかし、私が何をしても、それは止まらない。しかし、問題は、コンソールで同じことをすると完璧に動作するということです。

私は何かを見逃しましたか? フォームから別のスレッドを制御するにはどうすればよいですか?

+4

'CancelAsync()'メソッドは単に 'true'に' CancellationPending'プロパティを設定します。それは適切であると見なして、それを処理するのはワーカースレッドに任されています(通常は、定期的な間隔で保留中のキャンセルをチェックすることになります)。 – Ani

答えて

3

これが動作しているようです...

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     private BackgroundWorker _bw = new BackgroundWorker { WorkerSupportsCancellation = true, 
      WorkerReportsProgress = true}; 
     public Form1() 
     { 
      InitializeComponent(); 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (_bw.IsBusy) 
      { 
       _bw.CancelAsync(); 
      } 
      else 
      { 
       _bw.ProgressChanged += new ProgressChangedEventHandler(_bw_ProgressChanged); 
       _bw.DoWork += new DoWorkEventHandler(_bw_DoWork); 
       _bw.RunWorkerAsync(); 
      } 
     } 

     void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      textBox1.Text += (string)e.UserState; 
     } 

     void _bw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      int count = 0; 
      while (!_bw.CancellationPending) 
      { 
       _bw.ReportProgress(0, string.Format("worker working {0}", count)); 
       ++count; 
       Thread.Sleep(2000); 
      } 
     } 
    } 
} 
+0

Worked!はい、AniはCancellationPendingプロパティをtrueに設定していると言っていましたが、実際にキャンセルしていませんでした。好奇心をそそるのはコンソールで実際に働いたことです。ありがとう!! – chatran20

+0

こんにちは、あなたは質問に答えた印を付けることができますか?ありがとう! – Marco

関連する問題