2011-01-24 43 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()`方法只是設置了`CancellationPending`屬性爲TRUE;。由工作線程來處理這個問題(很可能是通過定期檢查一個待處理的消息),因爲它認爲合適。 – Ani 2011-01-24 05:08:04

回答

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

工作!是的,Ani說我將CancellationPending屬性設置爲true,但我實際上並未取消。奇怪的是,它在控制檯中實際上起作用。謝謝!! – chatran20 2011-01-24 19:42:23