c#学习笔记 跨线程触发自定义事件时,包装线程安全
2014-12-05 10:11
579 查看
namespace @delegate
{
public partial class Form1 : Form
{
private delegate void chang(object sender, myeventargs e);
private delegate void changedel(object sender, myeventargs e);
private event changedel events;
string b = "改变就是好事";
public Form1()
{
this.events+=new changedel(listen); //////////////////////////////订阅事件
InitializeComponent();
}
public class myeventargs : EventArgs
{
public string message;
public myeventargs(string a)
{
message = a;
}
}
public void eventing()
{
myeventargs mye = new myeventargs(b);
onevent(this, mye);
}
public void onevent(object sender, myeventargs e) ///////////////////////////////////////////包装成线程安全
{
if (events != null)
{
Delegate[] delegates = events.GetInvocationList(); /////////////////////////////////////////获取事件(委托对象)顺序调用多路广播委托的方法(本文中只有 changedel)
// Walk thru invocation list
foreach (changedel handler in delegates)
{
System.Windows.Forms.Control dispatcherObject = handler.Target as System.Windows.Forms.Control; //////////////////////////////////////获取订阅handler的类对象
// If the subscriber is a DispatcherObject and different thread
if (dispatcherObject != null && dispatcherObject.InvokeRequired)
///////////////////////////需要委托
{
// Invoke handler in the target dispatcher's thread
dispatcherObject.Invoke(handler, this, e);
}
else // Execute handler as is //////////////////////////不需要委托
{
events(this, e);
}
}
}
}
public void listen(object sender, myeventargs e) ///////////////////////////////////在子线程中改变主窗体控件属性(注:如果不包装成线程安全就需要用委托)
{
{
this.label1.Text = e.message;
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread tt = new Thread(new ThreadStart(this.eventing)); ///////////////////////////////////建立新线程触发自定义事件
tt.Start();
}
}
}
{
public partial class Form1 : Form
{
private delegate void chang(object sender, myeventargs e);
private delegate void changedel(object sender, myeventargs e);
private event changedel events;
string b = "改变就是好事";
public Form1()
{
this.events+=new changedel(listen); //////////////////////////////订阅事件
InitializeComponent();
}
public class myeventargs : EventArgs
{
public string message;
public myeventargs(string a)
{
message = a;
}
}
public void eventing()
{
myeventargs mye = new myeventargs(b);
onevent(this, mye);
}
public void onevent(object sender, myeventargs e) ///////////////////////////////////////////包装成线程安全
{
if (events != null)
{
Delegate[] delegates = events.GetInvocationList(); /////////////////////////////////////////获取事件(委托对象)顺序调用多路广播委托的方法(本文中只有 changedel)
// Walk thru invocation list
foreach (changedel handler in delegates)
{
System.Windows.Forms.Control dispatcherObject = handler.Target as System.Windows.Forms.Control; //////////////////////////////////////获取订阅handler的类对象
// If the subscriber is a DispatcherObject and different thread
if (dispatcherObject != null && dispatcherObject.InvokeRequired)
///////////////////////////需要委托
{
// Invoke handler in the target dispatcher's thread
dispatcherObject.Invoke(handler, this, e);
}
else // Execute handler as is //////////////////////////不需要委托
{
events(this, e);
}
}
}
}
public void listen(object sender, myeventargs e) ///////////////////////////////////在子线程中改变主窗体控件属性(注:如果不包装成线程安全就需要用委托)
{
{
this.label1.Text = e.message;
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread tt = new Thread(new ThreadStart(this.eventing)); ///////////////////////////////////建立新线程触发自定义事件
tt.Start();
}
}
}
相关文章推荐
- 黑马程序员--Java学习笔记之多线程(自定义线程的两种方式对比、线程状态、线程安全)
- C#开发学习笔记:编写自定义Button控件的自定义事件
- IssueVision 学习笔记(二)-----为控件添加自定义属性和事件
- C#学习笔记 委托和事件
- jquery学习之-阻止事件冒泡,触发自定义事件
- C#学习笔记之——事件
- 《CLR Via C# 第3版》笔记之(二十三) - 线程锁和线程安全的概念
- This event supports the .NET Framework infrastructure and is not intended to be used directly from your code?继承自VScrollbar的自定义winform控件,某些事件不触发的问题(Winform控件开发学习)
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
- c# 与java 相同实现 自定义事件的触发及监听
- C#学习笔记——常量、字段以及事件
- C#与.NET4 高级程序设计-----委托、事件 学习笔记
- c#中事件Event声明和触发,以及自定义事件委托和系统委托EventHandler
- 孙鑫VC学习笔记:第十六讲 利用事件对象实现线程间的同步
- 学习WF笔记9- 自定义活动中事件类型的属性(3)
- C#学习笔记(事件)
- 工作学习笔记——C#自定义类型剪贴板操作、自定义鼠标光标定位问题
- c#线程学习笔记一---基本概念
- 学习笔记之---C#中的委托与事件