C# Background Worker 逐一处理列表
C# Background Worker to process a List one by one
我有如下联系人列表。
List<string> Numbers = new List<string>();
此列表中可以包含任意长度的数字。我想一个一个地向这些号码发送消息,并在 WinForm 上向用户报告进度,所以我有这样的方法。
private void ProcessBroadcast()
{
foreach (var number in Numbers)
{
//Send a Message here
messageWorker.RunWorkerAsync(message);
}
}
由于发送消息需要时间,所以我们选择使用BackgroundWorker来发送消息。现在这里的问题是我们希望仅在后台工作人员完成后才继续将消息发送到 foreach 循环中的下一个数字。
我已经实现了
messageWorker_DoWork
&
messageWorker_RunWorkerCompleted
并且我能够在 messageWorker_RunWorkerCompleted 方法中获取数字。我已经完成了研究,但找不到与此相关的任何内容。
使用类似下面代码的 WaitHandle :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Threading;
namespace ConsoleApplication51
{
class Program
{
static AutoResetEvent block = new AutoResetEvent(false);
static void Main(string[] args)
{
block.Reset();
Test test = new Test();
block.WaitOne();
}
}
public class State
{
public string messsage = "";
}
public class Test
{
BackgroundWorker messageWorker = new BackgroundWorker();
static AutoResetEvent autoEvent = new AutoResetEvent(false);
List<int> Numbers = new List<int>() { 1,2,3,4,5};
public Test()
{
messageWorker.DoWork += new DoWorkEventHandler(messageWorker_DoWork);
messageWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(messageWorker_RunWorkerCompleted);
ProcessBroadcast();
}
public void ProcessBroadcast()
{
foreach (int number in Numbers)
{
//Send a Message here
autoEvent.Reset();
messageWorker.RunWorkerAsync(number);
autoEvent.WaitOne();
}
}
private void messageWorker_DoWork(object sender, DoWorkEventArgs e)
{
int? number = e.Argument as int?;
BackgroundWorker worker = sender as BackgroundWorker;
State state = new State() { messsage = "Done"};
}
private void messageWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
autoEvent.Set();
}
}
}
private void ProcessBroadcast()
{
//foreach (var number in Numbers)
//{
// //Send a Message here
// messageWorker.RunWorkerAsync(message);
//}
messageWorker.EnableProgressReporting = true;
messageWorker.RunWorkerAsync(Numbers);
}
工作
// this runs on a background pool thread
void DoWork(object sender, args)
{
var worker = sender as Backgroundworker;
var Numbers = args.Argument as IEnumerable<SomeThing>;
int percentage = 0;
foreach (var number in Numbers)
{
//Send a Message here
worker.ReportProgress(percentage, number);
// other processing on number, just don't use the UI
}
}
您的 Progress 和 Completed 事件处理程序将在主线程上执行。
(编译器检查了其中的none)
我有如下联系人列表。
List<string> Numbers = new List<string>();
此列表中可以包含任意长度的数字。我想一个一个地向这些号码发送消息,并在 WinForm 上向用户报告进度,所以我有这样的方法。
private void ProcessBroadcast()
{
foreach (var number in Numbers)
{
//Send a Message here
messageWorker.RunWorkerAsync(message);
}
}
由于发送消息需要时间,所以我们选择使用BackgroundWorker来发送消息。现在这里的问题是我们希望仅在后台工作人员完成后才继续将消息发送到 foreach 循环中的下一个数字。
我已经实现了
messageWorker_DoWork
&
messageWorker_RunWorkerCompleted
并且我能够在 messageWorker_RunWorkerCompleted 方法中获取数字。我已经完成了研究,但找不到与此相关的任何内容。
使用类似下面代码的 WaitHandle :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Threading;
namespace ConsoleApplication51
{
class Program
{
static AutoResetEvent block = new AutoResetEvent(false);
static void Main(string[] args)
{
block.Reset();
Test test = new Test();
block.WaitOne();
}
}
public class State
{
public string messsage = "";
}
public class Test
{
BackgroundWorker messageWorker = new BackgroundWorker();
static AutoResetEvent autoEvent = new AutoResetEvent(false);
List<int> Numbers = new List<int>() { 1,2,3,4,5};
public Test()
{
messageWorker.DoWork += new DoWorkEventHandler(messageWorker_DoWork);
messageWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(messageWorker_RunWorkerCompleted);
ProcessBroadcast();
}
public void ProcessBroadcast()
{
foreach (int number in Numbers)
{
//Send a Message here
autoEvent.Reset();
messageWorker.RunWorkerAsync(number);
autoEvent.WaitOne();
}
}
private void messageWorker_DoWork(object sender, DoWorkEventArgs e)
{
int? number = e.Argument as int?;
BackgroundWorker worker = sender as BackgroundWorker;
State state = new State() { messsage = "Done"};
}
private void messageWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
autoEvent.Set();
}
}
}
private void ProcessBroadcast()
{
//foreach (var number in Numbers)
//{
// //Send a Message here
// messageWorker.RunWorkerAsync(message);
//}
messageWorker.EnableProgressReporting = true;
messageWorker.RunWorkerAsync(Numbers);
}
工作
// this runs on a background pool thread
void DoWork(object sender, args)
{
var worker = sender as Backgroundworker;
var Numbers = args.Argument as IEnumerable<SomeThing>;
int percentage = 0;
foreach (var number in Numbers)
{
//Send a Message here
worker.ReportProgress(percentage, number);
// other processing on number, just don't use the UI
}
}
您的 Progress 和 Completed 事件处理程序将在主线程上执行。
(编译器检查了其中的none)