foreach (string file in listToConvert)
{
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += new DoWorkEventHandler(
(s3, e3) =>
{
newFile = sendFilesToConvert(file);
});
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
(s3, e3) =>
{
listBoxFiles.Items.Add(newFile);
});
backgroundWorker.RunWorkerAsync();
}
列表中的每个文件都将转换为另一个文件,我希望每个BackgroundWorker都会等待,直到它完成转换,然后才会启动下一个BackgroundWorker 我怎么能这样做?
答案 0 :(得分:2)
不要在循环的每次运行中创建Bgw。无论如何,这不是一个好主意。
只需在一个Bgw中运行foreach()
即可。
您可以使用progress事件将结果添加到列表框中,或者在列表中收集它们,并在完成后立即添加所有结果。
答案 1 :(得分:1)
您可以使用TPL:
Task<List<newFile>> task1 = Task<List<newFile>>.Factory.StartNew(() =>
{
List<newFile> newFiles = new List<newFile>();
foreach(string file in fileList)
{
newFiles.Add(SendFilesToConvert(file));
};
return newFilesList;
});
foreach(newFile nFile in task1.Result)
{
listBoxFiles.Items.Add(nFile);
};
答案 2 :(得分:0)
据我所知,您希望更新场景中的UI元素(listBoxFiles
)。所以你可以使用以下代码:
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
var context = SynchronizationContext.Current;
var filesList = // clone your listToConvert if it's not a local variable or other threads can access it
backgroundWorker.DoWork += (s3, e3) =>
{
foreach (string file in filesList)
{
var newFile = sendFilesToConvert(file);
context.Post(x => listBoxFiles.Items.Add(newFile), null);
// Report progress
}
};
backgroundWorker.RunWorkerAsync();
此代码每次需要更新UI控件时都会向UI线程发送一条消息(异步),然后UI线程调度消息并在适当的上下文中执行代码(ListBox.Items.Add(...)
)。