繁体   English   中英

C#Backgroundworker数据无效-线程问题?

[英]C# Backgroundworker data invalid - thread issue?

请看看我的问题:

我已经开发出可以长期运行的逻辑。 在运行逻辑时,我想将状态报告给进度条。 大! 所以我用了背景工作者:

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

在backgroundWorker_Dowork中,我具有完成这项工作的逻辑。 我还声明了一个计时器,每50毫秒调用一次以报告状态。(在backgroundWorker_DoWork中):

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

在timer_Elapsed中,我通过调用_backgroundWorker.ReportProgress(0)来更新UI控件。 我之所以没有在backgroundWorker_DoWork中调用ReportProgress的原因是,尽管我的代码花了一些时间,但我以前做的while循环却非常快。 如果我在while循环结束时调用ReportProgres,则会发生相同的非响应型UI问题。

现在我的问题是在处理少量数据时,当调用timer_Elapsed时,所有变量和数据均为0并且为null。 我似乎不知道为什么。.我在多线程编程方面拥有丰富的经验,但是C#掩盖了所有内容,而且我不知道哪个线程具有什么数据...

长时间运行的逻辑完成后,计时器将放置在backgroundWorker_DoWork中。

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

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

另外,您对“何时处理少量数据”的评论使我认为您的timer.Elapsed在后台工作人员已经完成并且您没有正确处理此情况后调用。

我建议您直接从后台工作人员报告进度。 只是不要在循环的每个迭代中执行此操作,只能在1000个循环中执行一个(实际数字应根据循环旋转的速度来选择)。

您可以在while循环中执行此操作,但不能在每次迭代中执行。 两种选择:

  1. 仅报告每n 迭代的进度(例如每100 迭代)
  2. 保持时间戳,当50ms过去时,报告状态并更新时间戳

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM