今天做个小东西时发现还是要用多线程,否则如计算时主界面就会卡死,这样用户体验就很不好。简单学习了下C#中的backgroundWorker,个人感觉和thread有点像。
简单说下自己用到的方法。时间有点紧,周末再重新理下。
RunWorkerAsync() :开始后台操作,可以理解为开始异步操作了,开始doWork事件,doWork事件里你要干的事
ReportProgress(Int32): 引发 ProgressChanged 事件。在涉及到异步线程中需要改变UI线程(我的理解是main线程)时,会无法实现,因为VS会提醒你这个控件不是你的,无法修改。这里我看到有人说用了这个就可以不用invoke了。例子在后面的example中有,不过我试了在我的东西里是不行的,之后周末的时候再确定一下。所以我遇到这个情况使用的还是invoke方法,如下
private void Update(DeltaImage delta)
{
if (PictureBox.InvokeRequired)
{
PictureBox.Invoke(new MethodInvoker(() => UpdateOnGuiThread(delta)));
}
else
{
UpdateOnGuiThread(delta);
}
}
关键部分已用红字标出,这是一个改变pictureBox的操作,类似的操作修改即可实现。
OnRunWorkerCompleted:引发 RunWorkerCompleted 事件。
CancelAsync: 这个也是例子中的一个方法,我们需要做到可以随时打断线程,无论是UI线程还是子线程。这里,我们cancel之后,把e.CancellationPending = true; 即标记上事件已取消。
reference:
1)概念,定义,方法(全)
https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.110).aspx
2)example
http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners