Lov*_*All 5 c# backgroundworker
我讨厌我的第一个问题似乎已被多次回答,但我仍然很难理解如何使用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++;
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个BackgroundWorker实例...:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Things go here
}
Run Code Online (Sandbox Code Playgroud)
...我已经尝试了很多东西来列出,所以我回到了上面的演示文稿的开头.
如果我了解BackgroundWorker,我需要执行以下操作:
用上面的代码替换上面代码中的processItem(stringA,stringB):
backgroundWorker1.RunWorkerAsync(processItem(stringA, stringB));
...然后做一些类型的DoWork呼叫?...然后进行某种类型的RunWorkerCompleted调用?
不知道为什么我的大脑会冻结,但是我花了很多时间在这上面并没有结果,我很尴尬.任何帮助将不胜感激.没有StackOverflow,我很久以前就会成为DOA.
仅供参考:我已经引用了其他SO帖子,MSDN和DotNetPerls示例.我想,我只是在概念上遗漏了一些东西.
将上面代码中的 processItem(stringA, stringB) 替换为...
不,这就是你遇到麻烦的原因。您肯定希望将 processFile() 调用移至工作线程。在工作线程中运行 processItem() 没有明显的好处,至少在您发布的代码片段中没有。而这样做很困难,需要启动不止一名工人。每个项目一个。有很多工人,每个人只做很少的工作,这并不是很健康。如果确实有必要,那么您不想使用BackgroundWorker,您将需要一种完全不同的方法,其中多个线程消耗线程安全队列中的工作数据包。如果可以避免的话就不要去那里。
唯一需要解决的重要问题是传递 processFile() 所需的字符串。幸运的是,BackgroundWorker.RunWorkerAsync() 有一个采用单个对象的重载。传递你的字符串。在 DoWork 事件处理程序中获取其值,将 e.Argument 转换回字符串。因此:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
string path = (string)e.Argument;
processFile(path);
}
private void processToolStripMenuItem_Click(object sender, EventArgs e) {
backgroundWorker1.RunWorkerAsync(openSingleFile.FileName);
processToolStripMenuItem.Enabled = false;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
processToolStripMenuItem.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14100 次 |
| 最近记录: |