【发布时间】:2015-01-16 21:36:20
【问题描述】:
在讨论我的问题之前,我想了解一下我的阶段。我对 C# 编程非常陌生。这是我第一次为此工作。所以我对 C# 的了解非常少。
我正在使用 C# 中的 Windows 窗体开发我的应用程序。在某个时刻,我应该同时运行 5 个操作。所以我尝试了 C# 工具箱中的BackGroundWorker 组件。
但是使用它,我只能处理 5 个操作中的一个。我尝试使用工具箱中的 5 个 BackGroundWorker 组件并分别定义了 DoWork 函数。
但是当我调用RunWorkerAsync() 函数时,它抛出了一个错误,说“backgroundworker is currently busy and cannot run multiple tasks concurrently”。
我不知道是否可以在我的程序中使用多个BackGroundWorker。创建数组对我没有帮助。因为我有一个无限循环要在BackGroundWorker 组件的DoWork 函数中运行。如果有任何其他方法可以同时运行 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");
}
}
}
}
【问题讨论】:
-
你使用的是同一个 BackgroundWorker 实例吗?
-
Agree。当工作人员仍然很忙时,您无法运行其他工作,请使用 另一个 工作人员。
-
不,我正在使用 BackgroundWorker 的不同对象,即 bw、bw1、bw2... 等,并使用不同的对象名称调用 RunWorker 函数。 @史蒂夫
-
另一个是什么意思?你想让我使用另一个对象吗?如果是这样,我已经做到了。我仍然无法实现它。 @kennyzx
-
那么如果您发布您的实际代码将会很有用。也许只是启动工作线程的行
标签: c# .net backgroundworker