将KeyValuePair列表从backgroundWorker1传递到backgroundWorker2

问题描述 投票:1回答:3

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

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。

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

c# multithreading backgroundworker
3个回答
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;
}

1
投票

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

// prepare the list
event.Set();

backgroundworker2,您应该在活动的某个时刻等待:

event.WaitOne();
// use the list

1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.