2014-03-12 38 views
0

我想利用.NET 4.5的新线程功能来设计一个系统来更新内存中的对象列表。多线程服务工程问题

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

基本上,我写了一个Feed抽象类,并且从每个线程的继承。线程类本身很简单,运行良好。

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

所以第一个问题是,在这些线程运行的时候,如何让父线程保持活着?我通过使用Console.read()将其当前写入开发控制台应用程序来阻止这种竞争条件。

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

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

回答

1

你可以用一些标志运行的,而“父”线程停止它:

while(flag){ 
    //run the thread 
} 

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

+0

查看具有超时而不是标志+ Thread.Sleep的'AutoResetEvent'。 – Andrey

0

如果'父'线程在处理过程中应该等待,它可以简单地调用异步方法(s)到await

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

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

0

如果您使用的任务,你可以使用Tasks.WaitAll等待任务完成。默认情况下,任务和异步/等待使用您的系统的ThreadPool,所以我会避免放置任何东西,但在这里相对较短的运行任务。

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

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

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

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