C# 限制要执行的BackgroundWorker的数量
我正在使用多个C# 限制要执行的BackgroundWorker的数量,c#,multithreading,datagridview,backgroundworker,C#,Multithreading,Datagridview,Backgroundworker,我正在使用多个backgroundworker来执行通过网络连接的过程。根据datagridview中的行数,它获取每一行的值并通过另一个类方法,该类方法执行长过程。这里我使用for循环来启动backgroundworker,因此问题是进程何时启动,根据datagridview行的计数,更多的backgroundworker开始运行。但我想限制这一点。例如,如果我有50行,我只想一次执行5个backgroundworkers。在这5个人完成任务后,下一个5个人必须开始。那么如何限制这些呢 我使用
backgroundworker
来执行通过网络连接的过程。根据datagridview
中的行数,它获取每一行的值并通过另一个类方法,该类方法执行长过程。这里我使用for循环来启动backgroundworker,因此问题是进程何时启动,根据datagridview
行的计数,更多的backgroundworker开始运行。但我想限制这一点。例如,如果我有50行,我只想一次执行5个backgroundworkers。在这5个人完成任务后,下一个5个人必须开始。那么如何限制这些呢
我使用了以下代码:
Backgroundworker bs;
private void button1_Click(object sender, EventArgs e)
{
threadNumber = 0;
threadRunning = 0;
for(int i=0;i<datagridview1.Rows.Count;i++)
{
bs = new Backgroundworker();
bs.DoWork += new DoWorkEventHandler(bs_DoWork);
bs.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bs_Completed);
bs.WorkerSupportCancellation = true;
bs.RunWorkerAsync(i);
}
}
private void bs_DoWork(object sender, DoWorkEventArgs e)
{
int i = (int)e.Argument;
while(bs.CancellationPending !=true && threadNumber < datagridview1.Rows.Count)
{
lock (this)
{
for (int i = 0; i < Max_Threads - threadRunning; i++)
{
if (threadNumber < datagridview1.Rows.Count)
{
Webmethod obj = new webmethod();
obj.Callmethod(i); // this takes long time to perform
threadNumber +=1;
threadRunning +=1;
}
}
}
}
}
Backgroundworker-bs;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
threadNumber=0;
threadRunning=0;
对于(int i=0;i您试图做的事情并不完全清楚。您的单击方法为每个数据行启动一个新的BackgroundWorker
,但随后您的DoWork
处理程序也为每行执行内部循环。非常混乱。我认为您想要的是启动Max_Threads
worker,并让它们合作处理e行
您在递增线程号时遇到问题。递增不是一个原子操作,因此,两个线程同时递增可能会导致相互重叠。您需要同步对该线程的访问,可能需要使用
我想你要做的是:
int threadNumber;
private void button1_Click(object sender, EventArgs e)
{
threadNumber = -1;
// Start Max_Threads workers
for(int i=0; i<Max_Threads; i++)
{
var bs = new Backgroundworker();
bs.DoWork += new DoWorkEventHandler(bs_DoWork);
bs.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bs_Completed);
bs.WorkerSupportCancellation = true;
bs.RunWorkerAsync();
}
}
private void bs_DoWork(object sender, DoWorkEventArgs e)
{
// Process items until cancellation requested, or until end of list
while(!bs.CancellationPending)
{
int rowNumber = Interlocked.Increment(ref threadNumber);
if (rowNumber >= datagridview1.Rows.Count)
{
break;
}
Webmethod obj = new webmethod();
obj.Callmethod(rowNumber); // this takes long time to perform
}
}
int-threadNumber;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
threadNumber=-1;
//启动最大线程数
for(int i=0;i=datagridview1.Rows.Count)
{
打破
}
Webmethod obj=新的Webmethod();
obj.Callmethod(rowNumber);//这需要很长时间才能执行
}
}
谢谢你的代码,它工作得很好。但我有一个疑问,在callmethod中,我给datagridview提供了每个进程的状态消息,但它没有显示出来。你能告诉我为什么会发生这种情况吗?