多线程服务工程问题

时间:2014-03-12 19:19:35

标签: c# .net multithreading

我正在尝试利用.NET 4.5新的线程功能来设计一个系统来更新内存中的对象列表。

多年前我在Java中使用过多线程,我担心我的技能已经停滞不前,特别是在.NET领域。

基本上,我编写了一个Feed抽象类,并且我继承了每个线程。线程类本身很简单,运行正常。

这些类中的每一个都无休止地运行,它们会阻塞直到事件发生并更新List。

所以第一个问题是,在这些线程运行时,如何让父线程保持活动状态?我通过使用Console.read()在开发控制台应用程序中编写此选项来防止此竞争状况。

其次,我想建立一个可以从父线程访问的List对象的存储库。如何从子线程更新这些列表并将它们暴露给另一个系统?试图避免SQL。共享内存?

我希望我已经说清楚了。我希望这样的事情:Writing multithreaded methods using async/await in .Net 4.5 除了,我们需要外部类的适应性,当然,我们需要以某种方式公开那些列表。

3 个答案:

答案 0 :(得分:1)

您可以在一段时间内运行“父”线程并使用一些标志来阻止它:

while(flag){
    //run the thread
}

您可以将公共列表公开为某个类的属性来保存您的数据。请记住在多线程代码中锁定访问权限。

答案 1 :(得分:0)

如果'parent'线程在处理期间应该等待,它可以只是await对异步方法的调用。

如果必须等待特定事件,您可以使用信号对象,例如Barrier

如果线程在等待时必须“做”,可以检查结果的可用性或进度:How to do progress reporting using Async/Await

答案 2 :(得分:0)

如果您正在使用任务,则可以使用Tasks.WaitAll等待任务完成。默认情况下,Tasks和async / await使用系统的ThreadPool,因此我不会在此处放置任何相对较短的运行任务。

如果你正在使用System.Threading.Thread(我更喜欢将这些用于长时间运行的线程),请在此处查看接受的答案:C# Waiting for multiple threads to finish

如果您可以获取批量数据,则可以使用自托管Web API或类似NancyFX的内容公开允许访问共享对象的服务。如果您更喜欢二进制通信,WCF和远程处理也是选项。

如果您有许多小事务,共享内存,保持活动的TCP连接或UDP是选项。也许你可以使用它们提供的C#绑定ZeroMQ(它不是传统的队列)?

对于列表的并发访问,请在实现自己的锁定之前查看System.Collections.Concurrent中的类。