在一个永久线程中运行事件处理程序

本文关键字:线程 运行 事件处理 程序 一个 | 更新日期: 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"); }));