Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程服务工程问题_C#_.net_Multithreading - Fatal编程技术网

C# 多线程服务工程问题

C# 多线程服务工程问题,c#,.net,multithreading,C#,.net,Multithreading,我正试图利用.NET4.5新的线程功能来设计一个系统来更新内存中的对象列表 多年前我在Java中使用多线程技术,我担心我的技能会停滞不前,尤其是在.NET领域 基本上,我已经编写了一个提要抽象类,并且为我的每个线程从中继承。线程类本身很简单,运行良好 这些类中的每一个都会无休止地运行,直到事件发生并更新列表为止 因此,第一个问题是,在这些线程运行时,如何保持父线程的活动状态?我已通过在当前带有console.read()的dev console应用程序中写入此内容来防止这种竞争条件 其次,我想建

我正试图利用.NET4.5新的线程功能来设计一个系统来更新内存中的对象列表

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

基本上,我已经编写了一个提要抽象类,并且为我的每个线程从中继承。线程类本身很简单,运行良好

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

因此,第一个问题是,在这些线程运行时,如何保持父线程的活动状态?我已通过在当前带有console.read()的dev console应用程序中写入此内容来防止这种竞争条件

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

我希望我已经说清楚了。我希望有这样的事情: 除此之外,我们需要外部类的适应性,当然,我们需要以某种方式公开这些列表。

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

while(flag){
    //run the thread
}

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

如果“父”线程在处理过程中应该等待,它可以简单地等待对异步方法的调用

如果它必须等待特定事件,您可以使用一个信令对象,例如


如果线程在等待时必须“执行”任务,则可以检查结果或进度的可用性:

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

如果您使用的是
System.Threading.Thread
(我更喜欢将这些用于长时间运行的线程),请在此处查看接受的答案:

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

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


要同时访问列表,请先查看System.Collections.concurrent中的类,然后再实现自己的锁定

查看带有超时的
AutoResetEvent
,而不是flag+Thread.Sleep。