NetworkComms网络程序开发笔记(一): 在多线程环境中安全的触发事件

8/3/2015来源:C#应用人气:1549

NetworkComms网络程序开发笔记(一): 在多线程环境中安全的触发事件

NetworkComms网络通信框架序言

在多线程中触发事件可能抛出引用为空的异常,这个问题网上有很多论述。

NetworkComms通信框架本身几乎没有使用事件,所以在核心通信框架中不存在这个问题。

在网上查了很多资料,比如下面这个:

我们采用的方案:

 public static class Extensions    {        public static void Raise<T>(this EventHandler<T> handler, object sender, T args) where T : EventArgs        {            if (handler != null)                handler(sender, args);        }    }

定义事件如下:

 //包含文件信息的事件参数    public class FileEventArgs : EventArgs    {        public FileEventArgs(FileDetail  fileInfo)        {            FileInfo = fileInfo;        }         public FileDetail FileInfo { get; set; }    }
 public event EventHandler<FileEventArgs> NewDoubleClick;

触发事件语句:

 NewDoubleClick.Raise(this,new FileEventArgs(this.FileInfo));

参考文章

http://stackoverflow.com/questions/786383/c-sharp-events-and-thread-safetyhttp://stackoverflow.com/questions/840715/the-PRoper-way-of-raising-events-in-the-net-frameworkhttp://stackoverflow.com/questions/9033/hidden-features-of-c/9282#9282http://stackoverflow.com/questions/840715/the-proper-way-of-raising-events-in-the-net-frameworkhttp://stackoverflow.com/questions/231525/raising-c-sharp-events-with-an-extension-method-is-it-badhttp://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspxhttp://stackoverflow.com/questions/786383/c-sharp-events-and-thread-safetyhttp://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3796170-add-raise-extension-method-for-eventhandler-and

www.cnblogs.com/networkcomms

www.networkcomms.cn