前些天帮同事解决一个多线程与控件调用的问题,我不想去理解他那复杂的业务,于是就写了这么一个Demo。
在开发Windows程序中,委托和事件用的很多,异步在某些场合下也会用到。曾经在用Dephi开发CRM软件的时候,我师傅对我说:“掌握了委托和事件,才叫Windows程序设计入了门”。可见委托和事件在Windows程序设计中的重要,其实,在ASP.NET服务端程序设计中,委托和事件也有非常广泛的用途,合理的使用,效果非常酷。因此,掌握这些东西,是每个想在程序路上发展的程序员必学的。
在开发Windows程序中,委托和事件用的很多,异步在某些场合下也会用到。曾经在用Dephi开发CRM软件的时候,我师傅对我说:“掌握了委托和事件,才叫Windows程序设计入了门”。可见委托和事件在Windows程序设计中的重要,其实,在ASP.NET服务端程序设计中,委托和事件也有非常广泛的用途,合理的使用,效果非常酷。因此,掌握这些东西,是每个想在程序路上发展的程序员必学的。
代码有简单的注释,废话就不多说了,要想看效果,做成Demo运行下即可。
using System;
using System.Collections.Generic;
using System.Text;
namespace MF
{
delegate void MulDoDelegate();
class Biz1
{
public int _count = 40;
public event MulDoDelegate MulDoing;
public event MulDoDelegate MulDoed;
public void Do()
{
for (int i = 0; i < _count; i++)
{
System.Threading.Thread.Sleep(50);
OnMulDo();
}
OnMulDoed();
}
public void OnMulDo()
{
if (MulDoing != null)
MulDoing();
}
public void OnMulDoed()
{
if (MulDoed != null)
MulDoed();
}
}
class Biz2
{
public int _count = 60;
public event MulDoDelegate MulDoing;
public event MulDoDelegate MulDoed;
public void Do()
{
for (int i = 0; i < _count; i++)
{
System.Threading.Thread.Sleep(50);
OnMulDo();
}
OnMulDoed();
}
public void OnMulDo()
{
if (MulDoing != null)
MulDoing();
}
public void OnMulDoed()
{
if (MulDoed != null)
MulDoed();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace MF
{
delegate void MulDoDelegate();
class Biz1
{
public int _count = 40;
public event MulDoDelegate MulDoing;
public event MulDoDelegate MulDoed;
public void Do()
{
for (int i = 0; i < _count; i++)
{
System.Threading.Thread.Sleep(50);
OnMulDo();
}
OnMulDoed();
}
public void OnMulDo()
{
if (MulDoing != null)
MulDoing();
}
public void OnMulDoed()
{
if (MulDoed != null)
MulDoed();
}
}
class Biz2
{
public int _count = 60;
public event MulDoDelegate MulDoing;
public event MulDoDelegate MulDoed;
public void Do()
{
for (int i = 0; i < _count; i++)
{
System.Threading.Thread.Sleep(50);
OnMulDo();
}
OnMulDoed();
}
public void OnMulDo()
{
if (MulDoing != null)
MulDoing();
}
public void OnMulDoed()
{
if (MulDoed != null)
MulDoed();
}
}
}
namespace MF
{
partial class Form2
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Windows Form Designer generated code
private System.Windows.Forms.Button button1;
}
}
{
partial class Form2
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Windows Form Designer generated code
private System.Windows.Forms.Button button1;
}
}
/* *********************************************************
* “多线程调用方法,异步赋值到窗体中的控件”的Demo
*
* 作者:李中华
* 版权:浙江新能量科技有限公司
* 日期:2008-6-11
* *********************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
namespace MF
{
public partial class Form2 : Form
{
Form1 f;
//sdsklfjasdlkfjasklsdfdsfsdfsdfsd;
Thread t1;
Thread t2;
Biz1 b1;
Biz2 b2;
//进度条绑定的委托
MulDoDelegate mdd;
//业务类1操作完成后的提示的绑定的委托
MulDoDelegate mdd1_ed;
//业务类2操作完成后的提示的绑定的委托
MulDoDelegate mdd2_ed;
public Form2(Form1 f)
{
InitializeComponent();
this.f = f;
b1 = new Biz1();
b2 = new Biz2();
//业务类1的操作事件
b1.MulDoing += new MulDoDelegate(Biz_MulDoing);
//业务类2的操作事件
b2.MulDoing += new MulDoDelegate(Biz_MulDoing);
//业务类1的操作完成事件
b1.MulDoed += new MulDoDelegate(b1_MulDoed);
//业务类2的操作完成事件
b2.MulDoed += new MulDoDelegate(b2_MulDoed);
//委托绑定到方法
mdd = new MulDoDelegate(OnMdd_Add);
//委托绑定到方法
mdd1_ed = new MulDoDelegate(OnMdd1_Added);
//委托绑定到方法
mdd2_ed = new MulDoDelegate(OnMdd2_Added);
this.f.progressBar1.Minimum = 0;
this.f.progressBar1.Maximum = b1._count + b2._count;
}
void b2_MulDoed()
{
f.label1.Invoke(mdd2_ed);
}
void b1_MulDoed()
{
f.label1.Invoke(mdd1_ed);
}
void Biz_MulDoing()
{
f.progressBar1.Invoke(mdd);
}
void OnMdd_Add()
{
//激发进度条
if (f.progressBar1.Value < f.progressBar1.Maximum)
f.progressBar1.Value++;
}
void OnMdd1_Added()
* “多线程调用方法,异步赋值到窗体中的控件”的Demo
*
* 作者:李中华
* 版权:浙江新能量科技有限公司
* 日期:2008-6-11
* *********************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
namespace MF
{
public partial class Form2 : Form
{
Form1 f;
//sdsklfjasdlkfjasklsdfdsfsdfsdfsd;
Thread t1;
Thread t2;
Biz1 b1;
Biz2 b2;
//进度条绑定的委托
MulDoDelegate mdd;
//业务类1操作完成后的提示的绑定的委托
MulDoDelegate mdd1_ed;
//业务类2操作完成后的提示的绑定的委托
MulDoDelegate mdd2_ed;
public Form2(Form1 f)
{
InitializeComponent();
this.f = f;
b1 = new Biz1();
b2 = new Biz2();
//业务类1的操作事件
b1.MulDoing += new MulDoDelegate(Biz_MulDoing);
//业务类2的操作事件
b2.MulDoing += new MulDoDelegate(Biz_MulDoing);
//业务类1的操作完成事件
b1.MulDoed += new MulDoDelegate(b1_MulDoed);
//业务类2的操作完成事件
b2.MulDoed += new MulDoDelegate(b2_MulDoed);
//委托绑定到方法
mdd = new MulDoDelegate(OnMdd_Add);
//委托绑定到方法
mdd1_ed = new MulDoDelegate(OnMdd1_Added);
//委托绑定到方法
mdd2_ed = new MulDoDelegate(OnMdd2_Added);
this.f.progressBar1.Minimum = 0;
this.f.progressBar1.Maximum = b1._count + b2._count;
}
void b2_MulDoed()
{
f.label1.Invoke(mdd2_ed);
}
void b1_MulDoed()
{
f.label1.Invoke(mdd1_ed);
}
void Biz_MulDoing()
{
f.progressBar1.Invoke(mdd);
}
void OnMdd_Add()
{
//激发进度条
if (f.progressBar1.Value < f.progressBar1.Maximum)
f.progressBar1.Value++;
}
void OnMdd1_Added()