Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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_Serial Port - Fatal编程技术网

C# 保证工作线程保持运行

C# 保证工作线程保持运行,c#,.net,multithreading,serial-port,C#,.net,Multithreading,Serial Port,我的程序使用生产者/消费者模式,这意味着我的生产者将任务添加到队列中,每当队列中有要执行的任务时,我的消费者就会在后台执行这些任务 我的工作线程需要使用串行端口,使用串行端口的标准方法是在程序开始时打开它,并在需要时保持它的打开状态(直到关机)。我的程序是一个始终在线的web服务,其中对象的生存期通常限定在请求的范围内。这两件事在某种程度上相互矛盾,因此我需要确保当我收到请求时,后台线程启动并运行,并保持串行端口打开,而不是为每个请求打开它,这在大多数情况下可能更自然。因此,我的程序需要高度的自

我的程序使用生产者/消费者模式,这意味着我的生产者将任务添加到队列中,每当队列中有要执行的任务时,我的消费者就会在后台执行这些任务

我的工作线程需要使用串行端口,使用串行端口的标准方法是在程序开始时打开它,并在需要时保持它的打开状态(直到关机)。我的程序是一个始终在线的web服务,其中对象的生存期通常限定在请求的范围内。这两件事在某种程度上相互矛盾,因此我需要确保当我收到请求时,后台线程启动并运行,并保持串行端口打开,而不是为每个请求打开它,这在大多数情况下可能更自然。因此,我的程序需要高度的自给自足,它需要检测工作线程中的错误,并在需要时重新启动它

有没有一种技术可以保证我的工作线程保持正常运行?我考虑过将整个工作线程的代码包装在一个try/catch中,并在finally块中向主线程发送一个事件,以便重新启动工作线程。或者我可以不断地向主线程发送“ping”事件,让它知道工作线程仍在运行,或者甚至从主线程轮询工作线程

有没有一个标准的方法可以做到这一点?最稳健的方法是什么?请注意,如果工作线程因任何原因死亡或无法完成其工作,这是可以的-我将重新启动线程并继续尝试,但是理想情况下,如果发生这种情况,它应该能够将其任务放回队列中


非常感谢C#/F#/dotnet(框架)中的示例。

最好的方法可能是运行单独的进程(Win NT服务)。在这之后,Asp.NETCore对运行后台进程有了更好的支持。这是一个很好的观点,也是我没有考虑过的。不过,它确实使部署和更新等一些事情变得更加复杂(我希望支持100多个安装)。我还体验到,windows服务有时在关闭时不会自动重新启动,这将是一个问题。我仍然必须手动保证服务已启动。这是一个很有吸引力的解决方案,因为我确实可以在我的大部分服务中使用:netcore。但我的主要问题仍然存在——如何保证这些服务的正常运行时间?NT服务可以设置为重新启动(直到手动关闭)。至于其他方面,这取决于许多因素。但是请注意,ASP.NET中没有“主线程”。最好的方法可能是运行单独的进程(Win NT服务)。在这之后,Asp.NETCore对运行后台进程有了更好的支持。这是一个很好的观点,也是我没有考虑过的。不过,它确实使部署和更新等一些事情变得更加复杂(我希望支持100多个安装)。我还体验到,windows服务有时在关闭时不会自动重新启动,这将是一个问题。我仍然必须手动保证服务已启动。这是一个很有吸引力的解决方案,因为我确实可以在我的大部分服务中使用:netcore。但我的主要问题仍然存在——如何保证这些服务的正常运行时间?NT服务可以设置为重新启动(直到手动关闭)。至于其他方面,这取决于许多因素。但是请注意,ASP.NET中没有“主线程”。