大马资讯论坛 - 马来西亚中文资讯平台

 找回密码
 注册
搜索
打印 上一主题 下一主题

C# Task.Factory 加 BackgroundWorker 运作方式 [教学、范例]

[复制链接]
跳转到指定楼层
1#
发表于 2012-9-8 16:07:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
身为software developer的我,threading真的很难用,我也搞不清楚怎样用。
后来经过搜索,发现Task Class比threading更加容易操作使用,但是,只能在.net framework 4.0或以上环境运行。
真的是个好消息,马上升级.net 4.0,真的省去很多时间哦。

我经历好久,以下三个错误是最常见的,只需要根据我以下的code,问题已经解决了。

1. Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
2. Cannot access a disposed object close.
3. The current SynchronizationContext may not be used as a TaskScheduler.


Task Class的运作方式是在后面执行的,所以会产生界面UI同步的问题,如上三个错误。
以下是范例,希望能帮得到你。

有些要注意的地方,如果没经验的话,使用Invoke会产生很多问题,因为控件不会自动dispose,尤其是当formclosing的时候。(当代码没执行完,使用者去按Close Form,会报错误)

this.Invoke(new MethodInvoker(delegate
{
//不建议使用,真的很多问题,FromCurrentSynchronizationContext是自动化的。
}
  1. private void btnTest_Click(object sender, EventArgs e)
  2.         {
  3.             //不让别人按,锁着
  4.             btnTest.Enabled = false;
  5.             //这个重要FromCurrentSynchronizationContext是要同步界面的
  6.             TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
  7.             //执行任务
  8.             Task task = Task.Factory.StartNew(() =>
  9.             {
  10.                 //把数字加起来
  11.                 int iValue = 1 + 1;
  12.                 //传给下面
  13.                 return iValue;
  14.             }
  15.             ).ContinueWith(x =>
  16.             {
  17.                 //x.Result是2,加3
  18.                 int iFinalValue = x.Result + 3;
  19.                 //再执行BackgroundWorker
  20.                 BackgroundWorker worker = new BackgroundWorker();
  21.                 worker.DoWork += (obj, ee) => WorkerDoWork(iFinalValue, uiScheduler);
  22.                 worker.RunWorkerAsync();

  23.             }, uiScheduler);//记得要放,不然会报错
  24.         }
复制代码
  1. private void WorkerDoWork(int iParameter, TaskScheduler uiScheduler)
  2.         {
  3.             //来个新的任务加字Is The Final Value
  4.             Task.Factory.StartNew(() =>
  5.             {
  6.                 return iParameter.ToString() + " Is The Final Value ";
  7.             }).ContinueWith(x =>
  8.             {
  9.                 // 当上面执行完后,弹出完成
  10.                 MessageBox.Show(x.Result + " 'Complete' ");
  11.                 //解放btnTest按钮
  12.                 btnTest.Enabled = true;
  13.             }, uiScheduler);//记得要放,不然会报错
  14.         }
复制代码

手机版|大马资讯论坛  

GMT+8, 2024-4-20 02:33 , Processed in 0.009931 second(s), 11 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表