本文,是自己在日常中用到的事件,然后自己总结的,没有查看相关文件,如果有高手能够看到本问,还希望能够指点下.谢谢
2008年1月7日
项目介绍:
联通hlr数据清理
本系统,由于现阶段有三个厂家的hlr需要清理,同时,由于联通的设备只支持单通道,因此,每个厂家只能支持一条条数据的做,不能够支持多条同时做,但是,各厂家之间是并行的,同时,由于西门子设备做一个查询后,需要停一下,释放一些东西,因此,做同样的数据两的清理,西门子做的时间明显大于其他厂家.
以前公司同事,采用的是每一个厂家,新开一个进程,每次执行500个号码,同时,这样有可能会使得其他设备的本次清理完成后,还在等待西门子设备清理,并且,如果有一个设备清理的过程中,出现错误,那么整个程序就死掉了.
2007年1月7日,该项目运行一段时间后,领导需要解决这个问题,因此,本人从公司调到联通,帮忙解决这个问题,查看系统流程后,打算改用事件,异步,回调等来做.
当天,自己给出了一个大概的模型,研究了下这个方式的可行性.
代码介绍如下:
HlrTaskTest
using System;

namespace HlrTaskTest


{

/**//// <summary>
/// ITask 的摘要说明。
/// </summary>
public interface ITask

{
string TaskName

{
get;
set;
}

/**//// <summary>
/// 任务执行状态
/// </summary>
TaskState TaskState

{
get;
set;
}


/**//// <summary>
/// 任务开始事件
/// </summary>
event TaskEventHandle BeginTask;

/**//// <summary>
/// 任务结束事件
/// </summary>
event TaskEventHandle TaskStoped;


}


/**//// <summary>
/// 任务现在的运行状态
/// </summary>
public enum TaskState

{

/**//// <summary>
/// 任务已经结束
/// </summary>
Stopped,

/**//// <summary>
/// 开始任务
/// </summary>
Run,
}


public class TaskEventArgs:EventArgs

{

private TaskState mTaskState;
public TaskEventArgs(TaskState taskState)

{
this.mTaskState=taskState;
}
public TaskState TaskState

{
get

{
return this.mTaskState;
}
}
}


public delegate void TaskEventHandle(object o,TaskEventArgs e);
}
HlrTaskTest
using System;

namespace HlrTaskTest


{

/**//// <summary>
/// Task 的摘要说明。
/// </summary>
public class Task:ITask

{
public Task()

{
}
private string mTaskName;
public string TaskName

{
get

{
return mTaskName;
}
set

{
mTaskName=value;
}
}

private TaskState mTaskState;

/**//// <summary>
/// 任务执行状态
/// </summary>
public TaskState TaskState

{
get

{
return this.mTaskState;
}
set

{
if(this.mTaskState!=value)

{
mTaskState=value;
switch(mTaskState)

{
case TaskState.Run:
OnBeginTask();
break;
case TaskState.Stopped:
OnTaskStoped();
break;
}
}
}
}

/**//// <summary>
/// 任务开始事件
/// </summary>
public event HlrTaskTest.TaskEventHandle BeginTask;
protected void OnBeginTask()

{
if(this.BeginTask!=null)

{
BeginTask.BeginInvoke(this,new TaskEventArgs(TaskState.Run),
new AsyncCallback(TaskRunToEnd),null);
// BeginTask(this,new TaskEventArgs(TaskState.Run));
}
}

private void TaskRunToEnd(IAsyncResult ar)

{
this.TaskState=TaskState.Stopped;
}

/**//// <summary>
/// 任务结束事件
/// </summary>
public event HlrTaskTest.TaskEventHandle TaskStoped;

protected void OnTaskStoped()

{
if(this.TaskStoped!=null)

{
TaskStoped.BeginInvoke(this,new TaskEventArgs(TaskState.Stopped),new AsyncCallback(TaskEnded),null);
//TaskStoped(this,new TaskEventArgs(TaskState.Stopped));
}
}

private void TaskEnded(IAsyncResult ar)

{
this.TaskStoped.EndInvoke(ar);
this.TaskStoped=null;
}
}
}
TaskManager
using System;
using System.Collections;

namespace HlrTaskTest


{

/**//// <summary>
/// TaskManager 的摘要说明。
/// </summary>
public class TaskManager

{
public TaskManager()

{
}

public void AddTask(ITask task)

{
if(!mTaskList.ContainsKey(task.TaskName.Trim()))

{
mTaskList.Add(task.TaskName.ToString().Trim(),task);
task.BeginTask+=new TaskEventHandle(task_BeginTask);
task.TaskStoped+=new TaskEventHandle(task_TaskStoped);
task.TaskState=TaskState.Run;
Log.WriteLine("testLog",task.TaskName.ToString()+"添加");
}
}
private Hashtable mTaskList=new Hashtable();
public Hashtable TaskList

{
get

{
return mTaskList;
}
}
public void RemoveTask(ITask task)

{
if(mTaskList.ContainsKey(task.TaskName.Trim()))

{
mTaskList.Remove(task.TaskName.Trim());
task.BeginTask-=new TaskEventHandle(task_BeginTask);
Log.WriteLine("testLog",task.TaskName.ToString()+"删除");
}
}

private void task_BeginTask(object o, TaskEventArgs e)

{
//执行任务,与boss数据比对,然后,在删除任务库中的数据
if(((Task)o).TaskName=="西门子")

{
System.Threading.Thread.Sleep(60*1000);//西门子的时候,时间弄一分钟,模拟表示西门子处理时间很长。
}
else
System.Threading.Thread.Sleep(20*1000);
Log.WriteLine("testLog",((Task)o).TaskName.ToString()+"开始");
}

private void task_TaskStoped(object o, TaskEventArgs e)

{
RemoveTask((ITask)o);
}
}
}
使用了下事件,因此,现在记录下一般的写法:
首先
定义一个委托
public delegate void TaskEventHandle(object o,TaskEventArgs e);
TaskEventArgs
委托中的TaskEventArgs 参数

public class TaskEventArgs:EventArgs

{

private TaskState mTaskState;
public TaskEventArgs(TaskState taskState)

{
this.mTaskState=taskState;
}
public TaskState TaskState

{
get

{
return this.mTaskState;
}
}
}
BeginTask

定义一个事件
public event HlrTaskTest.TaskEventHandle BeginTask;

并写一个保护方法
protected void OnBeginTask()

{
if(this.BeginTask!=null)

{
BeginTask.BeginInvoke(this,new TaskEventArgs(TaskState.Run),
new AsyncCallback(TaskRunToEnd),null);
// BeginTask(this,new TaskEventArgs(TaskState.Run));
}
}

由于这个地方使用了回调函数,BeginInvoke参数中的最后一个参数,不知道写什么,所以,用的null
则需要写一个回调函数
private void TaskRunToEnd(IAsyncResult ar)

{
this.TaskState=TaskState.Stopped;
}