在讨论我的问题之前,我想了解一下我的舞台。我是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");
}
}
}
}
答案 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模式的使用