我很抱歉,看起来我的第一个问题已经被回答了很多次,但我仍然很难理解如何使用BackgroundWorker调用方法。
我正在使用一系列类和方法处理非常大的文本文件。整个过程在用户选择工具栏项目后启动。按顺序进行如下:
- 用户选择工具栏项 - 用户通过对话框选择要处理的文件 - 操作开始
我认为我可以从用户弹出初始对话框的那一刻开始将所有内容都包装到BackgroundWorker中,但现在我想做的只是将所有繁重工作的方法放入它自己的实例中BackGroundWorker。我也会添加一个ProgressBar,但如果我能让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,我早就失败了。
FYI: 我已经参考了其他SO贴子,MSDN和DotNetPerls示例。 我只是在概念上缺失了一些东西,我想。