我一直在寻找解决方案,但一无所获。
在某些课程中我有活动
public class ClassWithEvent
{
public event Action<string> SomeEvent;
...
}
此活动有订阅者
public class SubscriberClass
{
public void SomeMethod(string value)
{
...
}
}
ClassWithEvent objectWithEvent = new ClassWithEvent();
SubscriberClass subscriberObject = new SubscriberClass();
objectWithEvent.SomeEvent += subscriberObject.SomeMethod;
主线程中的某个地方可以调用此事件。
if(SomeEvent != null)
SomeEvent(someString);
当它发生时,它的处理程序必须在第二个线程中运行。但是每次都在同一个线程中,所以第二个线程必须是永久性的,并且在第一次执行后不会被终止。
请帮我实现。
答案 0 :(得分:6)
创建共享队列:
private BlockingCollection<string> queue = new BlockingCollection<string>();
创建专用线程:
Thread thread = new Thread(HandleEvents);
thread.Start();
处理该线程上的事件:
private void HandleEvents()
{
foreach (string someValue in queue.GetConsumingEnumerable())
{
//Do stuff
}
}
引发事件时将项目放入队列:
objectWithEvent.SomeEvent += (x) => queue.Add(x);
关机时完成队列:
queue.CompleteAdding();
答案 1 :(得分:-2)
嗯这很棘手,但应该有效。
你需要创建永久线程,例如在那里启动while(true),以及在这个循环中检查的动作列表,如下所示:
ConcurrentBag<Action> actions = new ConcurrentBag<Action>();
new Thread(
delegate()
{
while (true)
{
Action a;
if (actions.TryTake(out a))
a();
}
}
).Start();
每次想要举起活动时,只需将动作添加到列表中:
actions.Add(new Action(() => { SomeEvent("abc"); }));