我讨厌我的第一个问题似乎已被多次回答,但我仍然很难弄清楚如何使用 BackgroundWorker 调用方法。
我正在使用一系列类和方法处理一个非常大的文本文件。在用户选择一个工具条项目后,整个过程就开始了。依次,它是这样的:
- 用户选择工具条项目
- 用户通过对话框选择要处理的文件
- 行动开始
我想我可以从用户弹出初始对话框的那一刻起将所有内容包装到 BackgroundWorker 中,但我现在想做的只是将完成所有繁重工作的方法放入它自己的 BackGroundWorker 实例中。我也会添加一个 ProgressBar,但我认为如果我可以让 BackgroundWorker 进程滚动,我可以处理它。
从顶部开始(用于示例目的的伪代码。为简洁起见,省略了很多):
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
string fileName = openSingleFile.FileName;
processFile(fileName);
}
static public void processFile(string fileName)
{
// many vars/loops exist but not shown
foreach (data in bigData)
{
processItem(stringA, stringB); // <-- this method is where the expensive work is done
x++;
}
}
我创建了一个 BackgroundWorker 的实例...:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Things go here
}
...而且我已经尝试了太多的东西来列出,所以我回到了上面演示的开头。
如果我了解 BackgroundWorker,我需要执行以下操作:
将上面代码中的 processItem(stringA, stringB) 替换为:
backgroundWorker1.RunWorkerAsync(processItem(stringA, stringB));
...然后进行某种类型的 DoWork 调用?...然后进行某种类型的 RunWorkerCompleted 调用?
不知道为什么我的大脑会冻僵,但我很尴尬我花了这么多时间却没有结果。任何帮助将不胜感激。如果没有 StackOverflow,我很久以前就会成为 DOA。
仅供参考:我参考了其他 SO 帖子、MSDN 和 DotNetPerls 示例。我想,我只是在概念上遗漏了一些东西。