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

时间:2014-09-05 21:17:21

标签: c# .net multithreading events

我一直在寻找解决方案,但一无所获。

在某些课程中我有活动

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);

当它发生时,它的处理程序必须在第二个线程中运行。但是每次都在同一个线程中,所以第二个线程必须是永久性的,并且在第一次执行后不会被终止。

请帮我实现。

2 个答案:

答案 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"); }));