Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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#_Multithreading - Fatal编程技术网

C#线程之间的通信

C#线程之间的通信,c#,multithreading,C#,Multithreading,我使用的是.NET3.5,我试图解决一个问题(不是一个超级线程专家) 我有一个windows服务,它有一个非常密集的进程,总是在运行,我将这个进程放在一个单独的线程上,以便我的服务的主线程可以处理操作任务,即服务审计周期、处理配置更改等 我通过典型的ThreadStart方法启动线程,该方法启动进程,称之为workerthread 在这个workerthread上,我正在向另一台服务器发送数据,正如预期的那样,服务器会时不时地重新启动,连接会丢失,我需要重新建立连接(连接丢失会通过事件通知我)。

我使用的是.NET3.5,我试图解决一个问题(不是一个超级线程专家)

我有一个windows服务,它有一个非常密集的进程,总是在运行,我将这个进程放在一个单独的线程上,以便我的服务的主线程可以处理操作任务,即服务审计周期、处理配置更改等

我通过典型的ThreadStart方法启动线程,该方法启动进程,称之为workerthread

在这个workerthread上,我正在向另一台服务器发送数据,正如预期的那样,服务器会时不时地重新启动,连接会丢失,我需要重新建立连接(连接丢失会通过事件通知我)。从这里,我重新连接逻辑,我重新开始运行,但是我很容易开始注意到,每次我都在一遍又一遍地创建这个工作线程(不是我想要的)

现在,我可以在失去连接时终止workerthread并启动一个新线程,但这似乎是在浪费资源

我真正想做的是将调用(即,我的线程启动方法)封送回仍然在内存中的线程,尽管它什么也不做

请张贴你所有有用的例子或文件

谢谢。

无论如何,我都会杀死工作线程(但如果可能的话,请优雅地结束)。一切都会被垃圾收集,你可以从头开始


这台服务器多长时间重新启动一次?如果这种情况经常发生,以至于资源成了问题,那么它可能发生得太频繁了。

您可以使用单例模式。在您的情况下,将连接设为静态对象。两个线程都可以访问该对象,这意味着构造并使用它


主线程可以在需要时构造它,工作线程可以在它可用时访问它。

改用
ThreadPool.QueueUserWorkItem
调用该方法。此方法从线程池中获取一个线程并启动一个方法。它似乎非常适合在另一个线程上启动方法

另外,当你说“典型的ThreadStart”时,你的意思是你正在用一个
ThreadStart
参数创建和启动一个新的
ThreadStart
,还是你正在创建一个
ThreadStart
并在其上调用
Invoke


据我所知,你只有一个线程在工作,除非你需要处理它

应该避免终止工作线程。强制杀死Win32线程时,并非其所有资源都会完全恢复。我相信当Win32线程被终止时,为线程堆栈保留的虚拟地址空间(或者是根页?)不会恢复。这可能不多,但在一个长期运行的服务器服务过程中,它会随着时间的推移而累积,最终导致您的服务中断

如果允许该线程退出其threadproc以正常终止,则会恢复所有资源

如果后台线程将持续运行(而不是休眠),则可以使用全局布尔标志在主线程和后台线程之间通信状态。只要后台线程定期检查此全局标志。如果设置了该标志,线程可以完全关闭并退出。如果主线程是唯一的写入程序,而后台线程只读取标志值,则不需要锁定语义

当后台线程与它发送数据的服务器失去连接时,为什么不自己执行重新连接?我不清楚为什么主线程需要拆下背景线程来启动另一个线程。

比使用普通线程慢一点,但它可以选择支持该方法。
基本上,
BackgroundWorker
是工作线程的包装器,包含一些额外的选项和事件

CancelAsync
方法仅在设置时有效。
当调用
CancelAsync
时,将设置 工作线程应定期检查
取消挂起
,查看是否需要提前退出


--jeroen

你能发布一点代码吗?+1个好问题,人们似乎不再投票给好问题了……这是我在Windows服务中的做法,但我在后台运行多个任务。@Robert:你是说,
QueueUserWorkItem
对于这样一个偶尔一次的任务来说太过分了吗?这可能是真的,但我习惯使用它,因为我知道我不必担心处理涉及的线程。QueueUserWorkItem线程应该只用于短期操作。将线程池线程用于长时间运行的操作可能会耗尽线程池(有限数量的线程),并导致进程中QueueUserWorkItem的其他客户端在线程池线程可用之前等待很长时间。有关线程与线程池的更多信息,请参见此处:Erk。对不起,我没有仔细阅读这个问题。QUWI可能不是他所需要的,但我也不认为在这里使用它会有任何伤害-他一次只运行一个线程,所以没有太多机会耗尽线程池。注意:正如dthorpe所指出的,您不应该只是转储线程。在以常规方式卸载线程之前,请尝试清理尽可能多的资源