一个关于委托、事件、多线程、异步的Demo

前些天帮同事解决一个多线程与控件调用的问题,我不想去理解他那复杂的业务,于是就写了这么一个Demo。
在开发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();
        }

    }

}


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;
    }

}
/* *********************************************************
 * “多线程调用方法,异步赋值到窗体中的控件”的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()
        
{
            
//提示用户完成了调用
            StringWriter sw = new StringWriter();
            sw.WriteLine(
"完成了业务操作2");
            f.label1.Text 
+= sw.ToString();

            
//执行玩后终止线程
            t1.Abort();    
        }

        
void OnMdd2_Added()
        
{
            
//提示用户完成了调用
            StringWriter sw = new StringWriter();
            sw.WriteLine(
"完成了业务操作1");
            f.label1.Text 
+= sw.ToString();

            
//执行玩后终止线程
            t2.Abort();        
        }


        
private void button1_Click(object sender, EventArgs e)
        
{
            
this.f.progressBar1.Value = 0;

            t1 
= new Thread(new ThreadStart(b1.Do));
            t2 
= new Thread(new ThreadStart(b2.Do));

            t1.Start();
            t2.Start();
        }

    }

}

/* *********************************************************
 * “多线程调用方法,异步赋值到窗体中的控件”的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 Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();

        }


        
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
        
{
            Form2 f 
= new Form2(this);
            f.MdiParent 
= this;
            f.WindowState 
= FormWindowState.Maximized;
            f.Show();
        }

    }

}


namespace  MF
{
    
partial class Form1
    
{
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.IContainer components = null;

        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>
        
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>

        protected override void Dispose(bool disposing)
        
{
            
if (disposing && (components != null))
            
{
                components.Dispose();
            }

            
base.Dispose(disposing);
        }


        
Windows 窗体设计器生成的代码

        
public System.Windows.Forms.ProgressBar progressBar1;
        
public System.Windows.Forms.Label label1;
        
private System.Windows.Forms.MenuStrip menuStrip1;
        
private System.Windows.Forms.ToolStripMenuItem 子窗体ToolStripMenuItem;
        
private System.Windows.Forms.ToolStripMenuItem 打开ToolStripMenuItem;

    }

}



using  System;
using  System.Collections.Generic;
using  System.Windows.Forms;

namespace  MF
{
    
static class Program
    
{
        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main()
        
{
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(
false);
            Application.Run(
new Form1());
        }

    }

}

你可能感兴趣的:(demo)