c# - 如何在Windows窗体上有效地多线程?

标签 c# .net winforms multithreading backgroundworker

这给我带来了困难。
关键是,我有一个可以在MIDI中播放某些音符的代码,并且希望能够将其暂停,因此我制作了一个简单的Form,如下所示:

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
        }
    }
}

当我单击它时,它开始播放,但是无论我做什么,它都无法停止。但问题是,如果我在控制台中执行相同的操作,则效果很好。

我错过了什么?
如何从表单控制单独的线程?

最佳答案

这似乎有效...

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);
            }
        }
    }
}

关于c# - 如何在Windows窗体上有效地多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4778820/

相关文章:

C# 序列化不序列化数据类型日期时间,仅序列化字符串

c# - 任务(System.Threading.Task)和线程的区别

c# - 如何在 TreeView 中获取当前选定的节点

c# - 启动脚本未触发

c# - List<T> 需要 '1' 类型参数

c# - WinForms 打印到默认打印机,即使它不可用/连接

c# - 如何使用 Linq to objects 按固定数量对我的选择进行分组?

c# - 使用 BrowserSession 和 HtmlAgilityPack 通过 .NET 登录 Facebook

c# - Canvas 上的 ScaleTransform 调整大小以比 child 更高的速度缩小 Canvas

vb.net - "make single instance application"这是做什么的?