.NET 事件模型教程(一)
目录
复制
保存
using System; using System.Threading; namespace percyboy.EventModelDemo.Demo1A { // 需要做很长时间才能完成任务的 Worker,没有加入任何汇报途径。 public class Worker { // 请根据你的机器配置情况,设置 MAX 的值。 // 在我这里(CPU: AMD Sempron 2400+,DDRAM 512MB) // 当 MAX = 10000,任务耗时 20 秒。 private const int MAX = 10000; public Worker() { } public void DoLongTimeTask() { int i; bool t = false; for (i = 0; i <= MAX; i++) { // 此处 Thread.Sleep 的目的有两个: // 一个是不让 CPU 时间全部耗费在这个任务上: // 因为本例中的工作是一个纯粹消耗 CPU 计算资源的任务。 // 如果一直让它一直占用 CPU,则 CPU 时间几乎全部都耗费于此。 // 如果任务时间较短,可能影响不大; // 但如果任务耗时也长,就可能会影响系统中其他任务的正常运行。 // 所以,Sleep 就是要让 CPU 有机会“分一下心”, // 处理一下来自其他任务的计算请求。 // // 当然,这里的主要目的是为了让这个任务看起来耗时更长一点。 Thread.Sleep(1); t = !t; } } } }
复制
保存
public void DoLongTimeTask() { int i; bool t = false; for (i = 0; i <= MAX; i++) { Thread.Sleep(1); t = !t; //在此处书写刷新用户界面状态栏的代码 } }
复制
保存
double rate = (double) i / (double) MAX; this.statusbar.Text = String.Format(@"已完成 {0:P2} ...",rate);
复制
保存
Public Class Worker Private Const MAX = 10000 Public Sub New() End Sub ' 注:此例的写法不符合 .NET Framework 类库设计指南中的约定, ' 只是为了让你快速理解事件模型而简化的。 ' 请继续阅读,使用 Demo 1F 的 VB.NET 标准写法。 ' ' 工作开始事件,并同时通知外界需要完成的数量。 Public Event StartWork(ByVal totalUnits As Integer) ' 进度汇报事件,通知外界任务完成的进度情况。 Public Event RateReport(ByVal rate As Double) ' 工作结束事件。 Public Event EndWork() Public Sub DoLongTimeTask() Dim i As Integer Dim t As Boolean = False Dim rate As Double ' 开始工作前,向外界发出事件通知 RaiseEvent StartWork(MAX) For i = 0 To MAX Thread.Sleep(1) t = Not t rate = i / MAX RaiseEvent RateReport(rate) Next RaiseEvent EndWork() End Sub End Class
复制
保存
public delegate void MyDelegate(int integerParameter);
复制
保存
public class Sample { public void DoSomething(int mode) { Console.WriteLine("test function."); } public static void Hello(int world) { Console.WriteLine("hello,world!"); } }
复制
保存
Sample sp = new Sample(); MyDelegate del = new MyDelegate(sp.DoSomething);
复制
保存
MyDelegate del = new MyDelegate(Sample.Hello);
复制
保存
del(12345);
复制
保存
using System; using System.Threading; namespace percyboy.EventModelDemo.Demo1D { // 需要做很长时间才能完成任务的 Worker,这次我们使用事件向外界通知进度。 public class Worker { private const int MAX = 10000; // 注:此例的写法不符合 .NET Framework 类库设计指南中的约定, // 只是为了让你快速理解事件模型而简化的。 // 请继续阅读,使用 Demo 1E / Demo 1H 的 C# 标准写法。 // public delegate void StartWorkEventHandler(int totalUnits); public delegate void EndWorkEventHandler(); public delegate void RateReportEventHandler(double rate); public event StartWorkEventHandler StartWork; public event EndWorkEventHandler EndWork; public event RateReportEventHandler RateReport; public Worker() { } public void DoLongTimeTask() { int i; bool t = false; double rate; if (StartWork != null) { StartWork(MAX); } for (i = 0; i <= MAX; i++) { Thread.Sleep(1); t = !t; rate = (double) i / (double) MAX; if (RateReport != null) { RateReport(rate); } } if (EndWork != null) { EndWork(); } } } }
复制
保存
public event [委托类型] [事件名称];
复制
保存
if (RateReport != null) { RateReport(rate); }
复制
保存
using System; using System.Threading; namespace percyboy.EventModelDemo.Demo1E { public class Worker { private const int MAX = 10000; public class StartWorkEventArgs : EventArgs { private int totalUnits; public int TotalUnits { get { return totalUnits; } } public StartWorkEventArgs(int totalUnits) { this.totalUnits = totalUnits; } } public class RateReportEventArgs : EventArgs { private double rate; public double Rate { get { return rate; } } public RateReportEventArgs(double rate) { this.rate = rate; } } public delegate void StartWorkEventHandler(object sender,StartWorkEventArgs e); public delegate void RateReportEventHandler(object sender,RateReportEventArgs e); public event StartWorkEventHandler StartWork; public event EventHandler EndWork; public event RateReportEventHandler RateReport; protected virtual void OnStartWork(StartWorkEventArgs e) { if (StartWork != null) { StartWork(this,e); } } protected virtual void OnEndWork(EventArgs e) { if (EndWork != null) { EndWork(this,e); } } protected virtual void OnRateReport(RateReportEventArgs e) { if (RateReport != null) { RateReport(this,e); } } public Worker() { } public void DoLongTimeTask() { int i; bool t = false; double rate; OnStartWork(new StartWorkEventArgs(MAX)); for (i = 0; i <= MAX; i++) { Thread.Sleep(1); t = !t; rate = (double) i / (double) MAX; OnRateReport(new RateReportEventArgs(rate)); } OnEndWork(EventArgs.Empty); } } }
复制
保存
private void button1_Click(object sender,System.EventArgs e) { statusBar1.Text = "开始工作 ...."; this.Cursor = Cursors.WaitCursor; long tick = DateTime.Now.Ticks; Worker worker = new Worker(); // 将事件处理程序与 Worker 的相应事件挂钩 // 这里我只挂钩了 RateReport 事件做示意 worker.RateReport += new Worker.RateReportEventHandler(this.worker_RateReport); worker.DoLongTimeTask(); tick = DateTime.Now.Ticks - tick; TimeSpan ts = new TimeSpan(tick); this.Cursor = Cursors.Default; statusBar1.Text = String.Format("任务完成,耗时 {0} 秒。",ts.TotalSeconds); } private void worker_RateReport(object sender,Worker.RateReportEventArgs e) { this.statusBar1.Text = String.Format("已完成 {0:P0} ....",e.Rate); }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |