Wal*_*tiD 7 c# event-handling begininvoke
我有以下EventHandler:
private EventHandler<MyEventArgs> _myEventHandler;
public event EventHandler<MyEventArgs> MyEvent
{
add { _myEventHandler += value; }
remove { _myEventHandler -= value; }
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释以下片段之间的区别吗?
Snippet EventHandler(A):
//Snippet A:
if (_myEventHandler != null)
{
_myEventHandler(new MyEventArgs());
}
Run Code Online (Sandbox Code Playgroud)
Snippet BeginInvoke(B):
//Snippet B:
if (_myEventHandler != null)
{
_myEventHandler.BeginInvoke(new MyEventArgs(), ar =>
{
var del = (EventHandler<MyEventArgs>)ar.AsyncState;
del.EndInvoke(ar);
}, _myEventHandler);
}
Run Code Online (Sandbox Code Playgroud)
澄清一下:调用EventHandler"就像它"和使用一样有什么区别BeginInvoke?
Mar*_*ell 14
该BeginInvoke方法是异步的,这意味着它是在不同的线程上引发的.如果人们不期待它,这可能是危险的,并且事件非常罕见 - 但它可能很有用.
另外,请注意,严格来说,您应该对事件处理程序值进行快照 - 如果(通过)您正在处理线程,则尤其如此Begin*.
var tmp = _myEventHandler;
if(tmp != null) {
tmp(sender, args);
}
Run Code Online (Sandbox Code Playgroud)
另外 - 请注意,您的事件订阅本身不是线程安全的; 再次,这只在你处理多线程时很重要,但是内置类字段事件是线程安全的:
public event EventHandler<MyEventArgs> MyEvent; // <===== done; nothing more
Run Code Online (Sandbox Code Playgroud)
这里避免的问题是:
| 归档时间: |
|
| 查看次数: |
23893 次 |
| 最近记录: |