.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);
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
