单个Windows窗体C#中的多个BackGroundWorker组件

时间:2015-01-16 10:35:45

标签: c# .net backgroundworker

在讨论我的问题之前,我想了解一下我的舞台。我是C#编程的新手。这是我第一次参与其中。所以我对C#的了解非常少。

我正在使用C#中的Windows Forms开发我的应用程序。在某个瞬间,我应该同时运行5个操作。所以我尝试了C#工具箱中的BackGroundWorker组件。

但是使用它,我只能在5.中处理我的一个操作。我尝试使用ToolBox中的5个BackGroundWorker组件并单独定义DoWork个函数。

但是当我调用RunWorkerAsync()函数时,它会输出一个错误,说" backgroundworker is currently busy and cannot run multiple tasks concurrently"。

我不知道我是否可以在我的程序中使用多个BackGroundWorker。创建数组并没有帮助我。因为我有一个无限循环要在DoWork组件的BackGroundWorker函数内运行。如果还有其他方法可以同时运行5个操作,请帮助我了解一下。提前谢谢。

这是我的代码:

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;
using System.Runtime.InteropServices;


namespace myapp5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            bw.WorkerSupportsCancellation = true;
            bw.WorkerReportsProgress = true;

            bw.DoWork += new DoWorkEventHandler(bw_DoWork);

            bw1.WorkerSupportsCancellation = true;
            bw1.WorkerReportsProgress = true;

            bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
        }

        BackgroundWorker bw = new BackgroundWorker();
        BackgroundWorker bw1 = new BackgroundWorker();
        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;
            }
            else
            {
                try
                {
                    videostream();
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message);
                }
            }
        }
        private void bw1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;
            }
            else
            {
                try
                {
                    videostream();
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message);
                }
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {

            if (bw.IsBusy != true)
            {
                bw.RunWorkerAsync();
            }
            else
            {
                MessageBox.Show("Background Worker is busy");
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            if (bw.WorkerSupportsCancellation == true)
            {
                bw.CancelAsync();
                bw.Dispose();
                MessageBox.Show("Background Closed");
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (bw1.IsBusy != true)
            {
                bw1.RunWorkerAsync();
            }
            else
            {
                MessageBox.Show("Background Worker is busy");
            }
        }
        private void button5_Click(object sender, EventArgs e)
        {
            if (bw1.WorkerSupportsCancellation == true)
            {
                bw1.CancelAsync();
                bw1.Dispose();
                MessageBox.Show("Background Closed");
            }
        }
    }
}

4 个答案:

答案 0 :(得分:1)

如果你想要执行5个不同的并行功能而不需要5个backgroundworker线程。一个Backgroupwork线程不足以运行5个不同的并行函数。

您也可以使用TPL(taksparallel)库而不是背景工作者。

答案 1 :(得分:0)

您应该尝试使用线程进行标称使用。

private object threadUnsafeObject;
    private object locker = new object();

    private void RunMulitpleThread()
    {
        object pass_your_parameter_here = "";
        for (int iCount = 0; iCount < 5; iCount++)
        {
            System.Threading.Thread thread = new System.Threading.Thread(DoWork);
            thread.Start(pass_your_parameter_here);

        }
    }

    private void DoWork(object parameters)
    {
        lock (locker)
        {
            threadUnsafeObject = parameters;
        }
    }

答案 2 :(得分:0)

我认为您的程序存在逻辑错误,因此使用相同的BackgroundWorker实例五次来调用RunWorkerAsync()。查看此代码。

UPD

您的DoWork处理程序必须如下所示:

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    while (true)
    {
        if ((worker.CancellationPending == true))
        {
            e.Cancel = true;
            break;
        }
        else
        {
            // perform work partially with short time!
            // and break the while loop at the end
        }
    }
}

UPD-2

不要对工人使用Dispose()。

答案 3 :(得分:0)

如果您使用.net 4.0或更高版本,则应使用“任务”。这是.NET框架移动的方向。我已经设置了两个小提琴供你查看。 如果您使用的是.NET 4.0:https://dotnetfiddle.net/GUxD2j。 如果您使用的是.NET 4.5:https://dotnetfiddle.net/NirDuU。此示例显示了.NET框架中引入的新await / async模式的使用