【问题标题】:Listen and notify using task使用任务监听和通知
【发布时间】:2023-04-10 13:19:02
【问题描述】:

我有这样的类来循环监听某些事件并通知订阅者一些事件。

这个类是正确的还是有另一个更好的实现方式,使用 TPL?

public class Listener
{
    public event EventHandler EventRaised;
    private void RaiseEvent()
    {
       if(EventRaised!=null)EventRaised(someParam);
    }
    public Task Listen()
    {
       return Task.Factory.StartNew(
        () =>
        {
            while(true)
            {
               //listen for some event
               RaiseEvent();
            }
        }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    }
}

例子

var listener = new Listener();
listener.EventRaised += SomeMethod;
listerner.Listen();

我询问了在后台通知订阅者某些事件的最佳方式。

【问题讨论】:

  • 你的目标是什么?这个类没有意义...
  • 查看主题,我已编辑。
  • 这个类只会不断地“通知”订阅者,在一个永无止境的循环中,并吃掉 CPU……你到底想做什么?
  • 你能举一个你想听的事件的例子吗?它实际上是另一个类引发的事件还是您需要轮询外部资源?
  • 在 RaiseEvent() 之前的代码中必须有一些动作(见代码中的注释)。

标签: c# .net multithreading parallel-processing task-parallel-library


【解决方案1】:

这绝对是一种方法,但您也可以使用 Rx 库。我建议不要在您的任务中留出一段时间,因为任务是为了终止。在某些时候,无论是来自异常还是错误。使用 Task.ContinueWith 方法可能是更好的选择。

【讨论】:

  • 我怎样才能在没有'while'的情况下制作永无止境的循环?我需要在程序工作期间一直倾听。
  • 使用该任务重载 ContinueWith 以进行递归调用以及其他用于错误检查和异常处理的方法。
  • @IEnumerable This other question有一个答案很好地说明了这一点。 stackoverflow.com/questions/7654632/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2012-07-30
相关资源
最近更新 更多