2014-03-27 29 views
0

请看看我的问题:C#Backgroundworker数据无效 - 线程问题?

我开发的逻辑会运行很长一段时间。在运行逻辑时,我想将状态报告给进度条。大!所以我用后台工作者:

_backgroundWorker = new BackgroundWorker(); 
_backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); 
_backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); 
_backgroundWorker.WorkerReportsProgress = true; 
_backgroundWorker.RunWorkerAsync(); 

在backgroundWorker_Dowork,我有逻辑工作。我还声明,被调用每50ms报告状态计时器(内backgroundWorker_DoWork):

timer.Elapsed += (senderr, ee) => timer_Elapsed(); 
_timer.Interval = 50; 

内timer_Elapsed,我更新通过调用UI控件_backgroundWorker.ReportProgress(0);我在BackgroundWorker_DoWork内部不会调用ReportProgress的原因是因为虽然我的代码需要一段时间,但我用来完成我的工作的while循环非常快。如果我在while循环结束时调用ReportProgres,则会出现相同的非响应类型的UI问题。

现在我的问题是处理少量数据时,调用timer_Elapsed时,所有的变量和数据都是0和null。我似乎无法弄清楚为什么..我有多线程编程丰富的经验,但C#掩盖了一切,我不知道哪个线程有什么数据...

然后定时器在backgroundWorker_DoWork内插入后长运行逻辑完成。

关于为什么这些数据无效的任何想法?任何暗示将不胜感激。

+0

DoWork调用的任何东西(包括事件触发)在运行BackgroundWorker的线程上处理。你可以发布你的代码timer_Elapsed? – JNYRanger

回答

1

您不会显示您的所有代码,但我对您描述的理解是,timer.Elapsed在与您的后台工作人员不同的线程上运行,因此您有竞争状况。

此外,您关于“何时处理小数据”的评论让我觉得您的timer.Elapsed在后台工作者已经完成并且您没有正确处理这种情况之后调用。

我建议你直接从后台工作人员报告进度。只是不要这样做迭代你的循环,只有1000(实际的数字应根据你的循环旋转速度来选择)。

0

你可以在while循环中做,但不是在每次迭代中。有两个选项:

  1. 只有在每n 报告进度次迭代(比如每100 迭代)
  2. 保持一个时间戳,当在50ms的经过,报告状态和更新时间戳