【发布时间】:2017-09-06 09:59:53
【问题描述】:
我目前有一个不断从 API 接收信息的类。 当它收到该信息时,它会触发其他类可以订阅的事件/委托。
因为我不想阻塞运行该类的线程,所以我使用 delegate.BeginInvoke 来触发事件。
例如。
object UpdateLock=new object();
List<Action<object, UpdateArgs>> UpdateSubscribersList = new List<Action<object, UpdateArgs>>();
public void UpdateSubscribe(Action<object, UpdateArgs> action)
{
lock (UpdateLock)
{
UpdateSubscribersList.Add(action);
}
}
public bool UpdateUnSubscribe(Action<object, UpdatePortfolioArgs> action)
{
lock (UpdateLock)
{
return UpdateSubscribersList.Remove(action);
}
}
public virtual void onUpdate(UpdateArgs args)
{
lock (UpdateLock)
{
foreach (Action<object, UpdateArgs> action in UpdateSubscribersList)
{
action.BeginInvoke(args, null, null);
}
}
}
这只是一个例子。不要担心使用列表而不是多播委托 - 还有一些其他代码导致我使用它。
无论如何我有两个问题:
1) 我应该把 EndInvoke 放在哪里,这样它就不会阻塞线程?我相信这个问题已经被问过了,但我不是很清楚,反正这不是我的主要问题。
2) EndInvoke 的主要目的是清理线程和处理异常。现在清理线程很好,但是我该如何处理异常呢?我不知道这些代表将调用哪些代码,并且该代码不是我的责任。那么无论如何我可以让这些事件的订阅者不得不处理清理代码和异常,而不是我的类?还是他们无论如何都可以访问 EndInvoke 返回的任何内容,以便如果他愿意,他可以处理任何异常?
【问题讨论】:
-
不是你的问题的真正解决方案,但你为什么不使用实际的
events? -
要在事件上使用 begininvoke ,无论如何您都必须从中获取代表列表,并且由于出于其他原因我需要一个用于订阅/取消订阅的包装器方法,因此仅使用代表就更简单了.
-
我在答案中添加了异常处理。
标签: c# .net multithreading delegates begininvoke