这种情况下该用什么方法以及什么情况下必须用事件

runerback 2016-10-28 04:30:15
之前一直都用得好好的,但最近突然觉得好像不太想用[事件]了,大神先别喷,我讲下我的想法,毕竟不够专业,一下说不清楚。

先申明个委托,再申明使用这个委托的事件,然后和这个委托类型相同的方法都可以绑定到事件的内置委托列表里,或者说叫注册这个事件的监听,这样在需要的时候就可以依次执行绑定过的委托。

但是有个问题就是,在触发事件的地方,必须等待所有注册过的委托都执行完之后才能继续往下走。
而我想实现的是,当事件被触发的时候,给所有的监听者发送一条消息,把参数啥的也附带上,这时事件发布者就不去管监听者了,只负责发送消息,而监听者收到消息之后做什么都不会再影响到事件发布者。而且一般来说事件委托基本不会用到Func<T>类型的,不需要等待返回值,为什么还要等着。

这种需求一般都是怎么实现的?还有什么地方才必须用事件?
...全文
464 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
runerback 2016-11-18
  • 打赏
  • 举报
回复
结贴。。。 qbilbo 1+1 = 2 starfd 1 = 1 sp1234 1+1+1+1 = 4 + -------------------------------------------------- = 7 shingoscar: 9 理由:偏题了。。 total:100-9=91
runerback 2016-10-28
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
“而监听者收到消息之后做什么都不会再影响到事件发布者”这个话没有技术基础来理解就成了标题党。
我只是想表达一种“分离”的状态。网上这样说的,当时看委托和事件的时候,不过确实有点故弄玄虚。
runerback 2016-10-28
  • 打赏
  • 举报
回复
引用 9 楼 qbilbo 的回复:
你觉得在同一个线程里能同时运行两个函数吗?
不能,没办法在线程开始之后再给里面放方法进去。
  • 打赏
  • 举报
回复
“而监听者收到消息之后做什么都不会再影响到事件发布者”这个话没有技术基础来理解就成了标题党。
qbilbo 2016-10-28
  • 打赏
  • 举报
回复
引用 5 楼 shaoerbao 的回复:
[quote=引用 1 楼 qbilbo 的回复:] 可以异步触发事件,xxEvent.BeginInvoke(....);
引用 2 楼 starfd 的回复:
事件执行的方法也是可以放在线程里的……
能不开新线程吗?线程有时候引发各种奇怪的问题,而且异常也不好抛出去。我想知道出了事件外有没有别的通知方法,GalaSoft.Messenger算是一个,不过用起来不太顺手。[/quote] 你觉得在同一个线程里能同时运行两个函数吗?
runerback 2016-10-28
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
public void ABC()
{
     ThreadPool.QueueUserWorkItem(h => 
     {
          .................
     });
}
原来都是这么用的啊。主要是不知道别人都在用什么样的方法
  • 打赏
  • 举报
回复
引用 5 楼 shaoerbao 的回复:
能不开新线程吗?线程有时候引发各种奇怪的问题,而且异常也不好抛出去。我想知道出了事件外有没有别的通知方法,GalaSoft.Messenger算是一个,不过用起来不太顺手。
那你就完全无理由去纠结“事件”了。你一方面要求服务程序调用客户委托时“不要等待”,另一方面又要求“不要异步”,这就好像说“我要一个又圆又方的桌子”,这是自己搞糊涂了。
  • 打赏
  • 举报
回复
一般来说,除非具体文档仔细推导过要异步调用 PassportChanged,否则其实还是以同步方式调用它。也就是以触发事件的那个线程来调用它。 然后注册了 PassportChanged 处理程序的客户程序,它自己去异步执行。例如
public void ABC()
{
     ThreadPool.QueueUserWorkItem(h => 
     {
          .................
     });
}
以及
obj. PassportChanged += ABC;
并不是束手无策,这纯粹是编程者自己的设计来决定的,并不是纠结于基本的事件概念有什么问题。
runerback 2016-10-28
  • 打赏
  • 举报
回复
引用 1 楼 qbilbo 的回复:
可以异步触发事件,xxEvent.BeginInvoke(....);
引用 2 楼 starfd 的回复:
事件执行的方法也是可以放在线程里的……
能不开新线程吗?线程有时候引发各种奇怪的问题,而且异常也不好抛出去。我想知道出了事件外有没有别的通知方法,GalaSoft.Messenger算是一个,不过用起来不太顺手。
  • 打赏
  • 举报
回复
例如定义事件模式
public event Action PassportChanged;
在你的程序中,如果你想异步并发去触发事件,可以写
if (PassportChanged != null)
    ThreadPool.QueueUserWorkItem(h => PassportChanged());
这里不用管什么“等待执行完、要返回”的问题。这就是一个“异步”的问题,而并不是“等待、返回”的问题。异步处理,照样可以等待执行完、等待返回,只不过对于“执行完、有返回值”的处理也就必须是异步处理的了。而你的问题,是跑到了误区里边去考虑了。
Poopaye 2016-10-28
  • 打赏
  • 举报
回复
做控件的时候,这样属性框里可以直接编辑,委托是看不见的。
  • 打赏
  • 举报
回复
事件执行的方法也是可以放在线程里的……
qbilbo 2016-10-28
  • 打赏
  • 举报
回复
可以异步触发事件,xxEvent.BeginInvoke(....);

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧