gpt4 book ai didi

c# - 在一个线程中引发事件以在第二个线程中调用方法

转载 作者:太空狗 更新时间:2023-10-30 00:57:07 25 4
gpt4 key购买 nike

我正在开发一个程序,该程序对来自互联网套接字的事件使用react,也可能来自计时器。使用两个线程似乎很自然:

  • 一个用于主程序
  • 第二个监听套接字、解析输入并引发适当的事件。

附加要求:

  1. 应用程序不应依赖于 UI 线程(它可以作为控制台应用程序运行)。
  2. 主程序应该同步处理消息,即按照消息到达的顺序。
  3. 主线程不能在等待计时器时阻塞(我想这意味着我必须在不同的线程上运行计时器)。

现在有一些问题:-):

  1. 我猜需求 #1 意味着我没有内置的消息泵,所以我不能从套接字监听器/计时器线程使用 Invoke()。这是正确的吗?
  2. 我如何才能安全地在一个线程(例如监听器)上引发事件,并让订阅者在另一个线程(主线程)上同步运行?
  3. 很可能在后续处理程序完成之前引发新事件。在这种情况下会发生什么? CLR 会在某处缓冲该事件,还是会忽略它?

最后但同样重要的是:我想我的目标是并行处理消息生产者/消费者范例,但我想使用事件而不是消息。您认为有更好的方法吗?

谢谢,

波阿斯

编辑

我想首先解释一下我使用事件的动机。该应用程序是一个自动交易引擎,必须响应市场中发生的事件(例如股票价格的变化)。当发生这种情况时,主线程上可能有多个订阅者应该被调用,这是使用事件的经典场景。

我想我总是可以将生产者/消费者与某些消息队列一起使用,并让消费者在主线程上引发事件,但我认为可能有更直接的方法。

最佳答案

我认为使用消息将是最简单的方法。如果您使用的是 C# 4,这非常容易,这要归功于 BlockingCollection<>

因此有一个共享的 BlockingCollection,其中 Message 是您的消息类。

然后在您的工作线程中执行此操作

var msgEnum = blockingCollection.GetConsumingEnumerable();

//Per thread
foreach( Message message in msgEnum )
{
//Process messages here
}

就是这样。

GetConsumingEnumerable() 将阻塞,直到有消息要处理为止。然后它将从队列中删除消息,您的循环将处理它。

这样做的好处是您可以添加更多线程,并且在每个线程中您只有 foreach 循环。

完成后调用 blockingCollection.CompletedAdding();

顺便说一句,队列处理并发并将同时发送的消息排队等等。

希望对你有帮助

安德烈

关于c# - 在一个线程中引发事件以在第二个线程中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6027449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com