事件用法实例
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Event
{
/// <summary>
/// 自定义一个事件参数类型
/// </summary>
public class ConsoleEventArgs:EventArgs
{
private String _message;
/// <summary>
/// 无参构造函数
/// </summary>
public ConsoleEventArgs():base()
{
_message = null;
}
/// <summary>
/// 带参构造函数
/// </summary>
/// <param name="message">信息</param>
public ConsoleEventArgs(string message):base()
{
_message = message;
}
/// <summary>
/// 属性,只读
/// </summary>
public string Message
{
get { return _message; }
}
}
/// <summary>
/// 管理控制台,在输出前发送输出事件
/// </summary>
public class ConsoleManage
{
//定义控制台事件成员对象
public event EventHandler<ConsoleEventArgs> ConsoleEvent;
/// <summary>
/// 控制台输出
/// </summary>
/// <param name="message">参数</param>
public void ConsoleOutput(string message)
{
ConsoleEventArgs args = new ConsoleEventArgs(message);
SendConsoleEvent(args);
Console.WriteLine(message);
}
/// <summary>
/// 负责发送事件
/// </summary>
/// <param name="args"></param>
protected virtual void SendConsoleEvent(ConsoleEventArgs args)
{
// 定义一个临时引用变量,这样可以确保多线程访问时不会发生问题
EventHandler<ConsoleEventArgs> temp = ConsoleEvent;
if (temp!=null)
{
temp(this, args);
}
}
}
/// <summary>
/// 日志类,订阅控制台输出事件
/// </summary>
public class Log
{
//日志文件
private const string LogFile = "C:\\Test\\Log.txt";
public Log(ConsoleManage cm)
{
//订阅输出事件
cm.ConsoleEvent += WriteLog;
}
private void WriteLog(object send, EventArgs arg)
{
if (!File.Exists(LogFile))
{
using(FileStream fs=File.Create(LogFile)){}
}
FileInfo info = new FileInfo(LogFile);
using(StreamWriter sw=info.AppendText())
{
sw.WriteLine(DateTime.Now.ToString() + " | " + send.ToString() + " | " + ((ConsoleEventArgs)arg).Message);
}
}
}
class ConsoleEvent
{
static void Main(string[] args)
{
ConsoleManage cm = new ConsoleManage();
Log log = new Log(cm);
cm.ConsoleOutput("测试控制台输出事件");
cm.ConsoleOutput("测试控制台输出事件");
cm.ConsoleOutput("测试控制台输出事件");
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Event
{
/// <summary>
/// 自定义一个事件参数类型
/// </summary>
public class ConsoleEventArgs:EventArgs
{
private String _message;
/// <summary>
/// 无参构造函数
/// </summary>
public ConsoleEventArgs():base()
{
_message = null;
}
/// <summary>
/// 带参构造函数
/// </summary>
/// <param name="message">信息</param>
public ConsoleEventArgs(string message):base()
{
_message = message;
}
/// <summary>
/// 属性,只读
/// </summary>
public string Message
{
get { return _message; }
}
}
/// <summary>
/// 管理控制台,在输出前发送输出事件
/// </summary>
public class ConsoleManage
{
//定义控制台事件成员对象
public event EventHandler<ConsoleEventArgs> ConsoleEvent;
/// <summary>
/// 控制台输出
/// </summary>
/// <param name="message">参数</param>
public void ConsoleOutput(string message)
{
ConsoleEventArgs args = new ConsoleEventArgs(message);
SendConsoleEvent(args);
Console.WriteLine(message);
}
/// <summary>
/// 负责发送事件
/// </summary>
/// <param name="args"></param>
protected virtual void SendConsoleEvent(ConsoleEventArgs args)
{
// 定义一个临时引用变量,这样可以确保多线程访问时不会发生问题
EventHandler<ConsoleEventArgs> temp = ConsoleEvent;
if (temp!=null)
{
temp(this, args);
}
}
}
/// <summary>
/// 日志类,订阅控制台输出事件
/// </summary>
public class Log
{
//日志文件
private const string LogFile = "C:\\Test\\Log.txt";
public Log(ConsoleManage cm)
{
//订阅输出事件
cm.ConsoleEvent += WriteLog;
}
private void WriteLog(object send, EventArgs arg)
{
if (!File.Exists(LogFile))
{
using(FileStream fs=File.Create(LogFile)){}
}
FileInfo info = new FileInfo(LogFile);
using(StreamWriter sw=info.AppendText())
{
sw.WriteLine(DateTime.Now.ToString() + " | " + send.ToString() + " | " + ((ConsoleEventArgs)arg).Message);
}
}
}
class ConsoleEvent
{
static void Main(string[] args)
{
ConsoleManage cm = new ConsoleManage();
Log log = new Log(cm);
cm.ConsoleOutput("测试控制台输出事件");
cm.ConsoleOutput("测试控制台输出事件");
cm.ConsoleOutput("测试控制台输出事件");
Console.Read();
}
}
}
浙公网安备 33010602011771号