【问题标题】:Preferred way of passing data across threads跨线程传递数据的首选方式
【发布时间】:2011-07-01 02:50:05
【问题描述】:

我有一个主线程,它应该处理来自多个工作线程的数据。

但是这个数据不是一个特定的类。

大约有 6-7 个类,我需要将其中一个类从工作线程传递给主线程。

以前我只有一个跨线程传递的类。我正在使用;

BlockingCollection<MyClass> mainQueu = new BlockingCollection<MyClass>(new ConcurrentQueue<MyClass>());

所以我将 MyClass 实例从多个线程推送到 mainQueu,而主线程试图从 mainQueu 中获取。

但是如果我有不止一门课怎么办。哪种方式更好?

  1. 为每种类型的类设置一个队列:

    当然应该有另一个类型的队列可能是枚举,指定哪个类被推送到队列中。并且主线程总是试图从这个队列中获取。一旦任何项目到来,它将从相关队列中获取。

  2. 选角:

    只有一个主队列,在 mainQueue 类中,我可以拥有对象成员。 以及指定对象成员类型的枚举。 而且我可以在推送到队列时将类转换为对象,并且在主线程中我可以将其转换回原始类。

希望清楚。

非常感谢,问候

【问题讨论】:

  • 不,你不应该。 :) 利率如此之低似乎很奇怪。也许您的问题可以/应该扩展,或者如果其他问题不够充分,您可以回答自己的问题,但您最终解决了问题。

标签: c# multithreading .net-4.0


【解决方案1】:

这里的一个有用技巧是让工作人员作为代表的队列;例如,Action。然后调用者可以将适当的方法排入队列(通过捕获的变量)任何必要的状态。

比如说,你有一个void Enqueue(Action) 方法;调用者可以这样做:

queue.Enqueue(targetObject.Method);

(其中targetObject.Methodvoid Method() {...}),或者可以执行以下操作:

queue.Enqueue(() => SomeMethod(foo, bar, 123));

(其中foobar 是希望完成工作的代码的本地)

所以我们一次传递了很多状态,而不是一次必须考虑类型 - 只是操作。

【讨论】:

  • 非常感谢您的回答。捕获的变量的范围呢?什么时候会被垃圾回收?
  • @AFgone 一旦委托被出列并丢弃,当然:任何编译器生成的捕获类都将被收集。
  • 再次感谢您的帮助。我正在尝试实施您的建议。如果我需要任何帮助,我可以稍后再回来提出新问题。问候
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2012-12-20
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多