多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合
来源:互联网 发布:淘宝接单app 编辑:程序博客网 时间:2024/06/05 02:52
效果图
1.创建线程参数类和事件参数类
public class ThreadParam
{
public int threadType;
public ThreadParam(int threadType)
{
this.threadType = threadType;
}
}
public class ThreadEventArgs : EventArgs
{
public double Counter;
public ThreadEventArgs( double counter)
{
this.Counter = counter;
}
}
2.创建线程要指派的委托和全局锁对象,完成进度
delegate void CommonBeginInvoke();
object sync = new object();//所对象
/// <summary>
/// 进度
/// </summary>
private double Counter;
/// <summary>
/// 线程个数
/// </summary>
private int Scaler = 0;
public delegate void EventHandler(object sender,ThreadEventArgs e);
public event EventHandler CommonNotify;
3..创建线程,实例化线程传递给委托的参数类,通过判断参数类给不同的线程指定相应的方法
public void CreateThread()
{
ThreadParam threadParam = null;
for (int key = 0; key < 2; key++)
{
threadParam = new ThreadParam(key);
copyFileThread = new Thread(new ParameterizedThreadStart(Operate));//Operate回调方法
copyFileThread.Name =key.ToString();
copyFileThread.IsBackground = true;
copyFileThread.Start(threadParam);//threadParam线程参数
}
}
4.给线程指定委托
void Operate(object param)
{
if (param is ThreadParam)
{
ThreadParam tParams = param as ThreadParam;
if (tParams != null)
{
if (tParams.threadType==1)
{
CompressFileDelegate copyFileBeginInvoke = FunctionA;
copyFileBeginInvoke.BeginInvoke(CallBack, 1);
}
if (tParams.threadType == 2)
{
CompressFileDelegate copyFileBeginInvoke = FunctionB;
copyFileBeginInvoke.BeginInvoke(CallBack,2);
}
}
}
}
5.回调方法
public void CopyFileCallBack(IAsyncResult result)
{
object[] tmp = result.AsyncState as object[];
lock (sync)
{
this.Scaler += 1;
if (this.Scaler == 2)
this.Counter = 100;
else
this.Counter = this.Counter + (100 / 2);
if (this.CommonNotify != null) //判断该事件是否被订阅
{
ThreadEventArgs e = new ThreadEventArgs(tmp[0].ToString(), this.Counter);
CommonNotify(this, e); //给订阅者发送通知
}
}
}
6.Form.cs文件form构造函数中订阅事件
Common common = new Common();
common.CommonNotify += new Common.EventHandler(UpdateToolStripProgressBarValueEvent);
7.更新界面
public void UpdateToolStripProgressBarValueEvent(object sender,ThreadEventArgse) //这个方法的样式和委托必须一致
{
int value= Convert.ToInt32(e.Counter);
this.toolStripProgressBar1.Value =value;
if (value==100)
{
MessageBox.Show("success");
this.toolStripProgressBar1.Value = 0;
this.toolStripStatusLabel1.Text = "";
this.buttonCreate.Enabled = true;
}
}
- 多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合
- 多线程异步编程(1):创建多个线程执行任务,同时更新进度条,使用WaitHandle发送信号
- 关于异步更新UI界面多线程执行后台操作的一些思路整理
- 子线程如何异步更新Fragment的UI界面
- 子线程如何异步更新Fragment的UI界面
- 异步任务 AsyncTask 进度条的更新
- Thread+Handler异步执行耗时操作更新UI线程界面
- MFC利用线程更新界面
- 安卓开发观察者模式应用-一个service通知多个activity更新ui的实现
- android异步更新UI界面的方法
- dispatch_async 与 NSThread 创建一个任务(更新界面)
- BeginInvoke的使用-1 :子线程更新主界面
- 观察者模式的异步进度条
- 多线程之winform界面的更新
- Android多线程界面更新方法的总结
- 后台线程更新界面的巧妙方法
- Android学习札记29:对线程更新UI界面的一些理解(2)
- BackgroundWorker异步更新界面
- Rman中各种format参数说明
- 简单很实用的聊天室(不看会后悔的哦!~~~)
- Luajit 调用Advapi32.dll中API函数输出随机字串
- 呼呼
- 走向DBA[MSSQL篇] - 从SQL语句的角度提高数据库的访问性能
- 多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合
- MFC 静态文本设置透明
- 类的错误查找
- android 手动打包
- 把Linux Ubuntu安装到U盘上
- 第三周任务2
- CLR via C# 学习笔记(2012/3/7)
- N个整数寻找k个最小的数
- 关于Mysql里的相关大小写问题