【发布时间】:2011-08-31 19:08:01
【问题描述】:
使用 C# .NET 3.5。
看来我不是唯一一个,因为搜索似乎提出了很多类似的问题,但是阅读它们我似乎仍然缺少解决方案。
我正在通过单击我的 UI 上的按钮引发一个事件,然后应该启动一个 backgroundWorker 以完成一些耗时的工作 - 在这种情况下,我希望它从表单中收集信息并 a) 编写到 xml 文件以及 b) 将信息插入远程数据库。
我相信这正是 backgroundWorker 的设计和意图。
这是事件引发代码。
private void btnFinish_Click(object sender, EventArgs e)
{
clkFinish.setInstant();
curAct.setTimeFinish(DateTime.Now);
btnStart.Enabled = true;
bgwDataWorker.RunWorkerAsync();
for (int i = 0; i < 20; i++)
{
Console.WriteLine("Thread a: " + i);
Thread.Sleep(100);
if (i == (20 - 1))
{
Console.WriteLine("Finished");
}
}
}
如您所见,我有一些代码用于平衡后台工作人员代码,这里是:
private void bgwDataWorker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("Running in a different thread now");
int count = 0;
for (int i = 0; i < 21; i++)
{
Console.WriteLine("Thread b: " + i);
Thread.Sleep(100);
(sender as BackgroundWorker).ReportProgress(5 * i, null);
if (i == (21 - 1))
{
count = i;
}
}
e.Result = count;
}
到目前为止,一切似乎都在进行中。
我的问题是当 DoWork 方法中的代码完成时,什么都没有发生。下面是 ProgressChanged 和 RunWorkerComplete 方法。
private void bgwDataWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage);
}
private void bgwDataWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("Result is " + e.Result.ToString());
}
这让我很困惑。
我尝试运行examples from MSDN,但遇到了同样的问题。由于某种原因根本没有引发 RunWorkerCompleted 和 ReportProgress 事件,我不明白为什么。
感谢阅读。
艾伦
【问题讨论】:
-
您在控制台应用程序中使用后台工作程序,对吗?您是否看到任何控制台输出?这看起来更像 Windows 应用程序,因为您在顶部有一个按钮单击事件处理程序。运行应用时是否有控制台窗口?
-
乔德雷尔,谢谢。不,这不是控制台应用程序,它是基于 Windows 窗体的应用程序。我使用的是 Visual Studio 10,console.writeline 输出来自调试输出。
-
@inksmithy:我看到了同样的行为——你解决了吗?
-
@BlueChippy 不幸的是,不,我最终把所有东西都扔进了计时器。这不是一个理想的解决方案,但由于计时器使用自己的线程来运行它的任务,所以它完成了工作。我仍在努力寻找解决方案。
标签: c# multithreading .net-3.5 backgroundworker