在一个永久线程中运行事件处理程序
本文关键字:线程 运行 事件处理 程序 一个 | 更新日期: 2023-09-27 18:21:00
我一直在寻找解决方案,但一无所获。
在某些类别中,我有事件
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);
当它发生时,它的处理程序必须在第二个线程中运行。但每次都在同一个线程中,所以第二个线程必须是永久的,并且在第一次执行后不会终止。
请帮我实现这个。
创建共享队列:
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();
这很棘手,但它应该可以工作。
您将需要创建永久线程,例如通过在那里启动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"); }));