将KeyValuePair列表从backgroundWorker1传递到backgroundWorker2

时间:2011-12-17 20:19:29

标签: c# multithreading backgroundworker

我有一点问题,我正在使用

var filelist = new List<KeyValuePair<string, string>>();
 filelist.Add(new KeyValuePair<string, string>(a, b));
 filelist.Add(new KeyValuePair<string, string>(c,d));
在backgroundWorker1中,做它需要做的事情,当backgroundWorker1完成时,列表应该以某种方式传递给backgroundWorker2。

我不知道哪里可以开始这样做,所以非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

确保列表对两个worker和一个事件变量都可见(例如,它可以是AutoresetEvent)。然后当列表中的工作在backgroundworker1中完成时,指示第二个工作人员阅读它:

// prepare the list
event.Set();

backgroundworker2中你应该等待事件的某个时刻:

event.WaitOne();
// use the list

答案 1 :(得分:1)

您只需在用于处理第一个BackgroundWorker的RunWorkerCompleted事件的委托中启动第二个BackgroundWorker。

只需将BW#2的RunWorkerAsync调用中的args设置为BW#1的返回值。

听起来BW#2在BW#1完成之前有任何事情要做,所以没有必要实现共享状态或引发事件或实现观察者类型模式。

答案 2 :(得分:0)

让第一个RunWorkerCompleted以参数开始第二个。这是一个例子,仅仅是关于如何从第一个到第二个发送参数的想法。

public Form1()
{
    InitializeComponent();
    backgroundWorker1.DoWork += backgroundWorker1_DoWork;
    backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;

    backgroundWorker2.DoWork += backgroundWorker2_DoWork;
    backgroundWorker2.RunWorkerCompleted += backgroundWorker2_RunWorkerCompleted;

    backgroundWorker1.RunWorkerAsync();
}


void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = "a";
}

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    string s = (string)e.Result;
    backgroundWorker2.RunWorkerAsync(s);
}

void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = (string)e.Argument;
}

void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Text = (string)e.Result;
}