事件用法实例

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

}

 

posted on 2010-07-15 00:02  晴天1848  阅读(192)  评论(0)    收藏  举报