我想设计一个应用程序,在两个完全独立的系统之间提供双向通信。(网桥)
其中一个可以通过Web服务调用我的应用程序 - 另一个是第三方硬件。它说RS232。使用RS232< - > ETH收发器,我们设法使用TCP与硬件通信。
该计划具有以下要求。
这是我来自的地方:
由于.NET中有很多开发(4+)我不确定采用哪种方法 ...互联网上充满了2005年至2010年的例子,这些例子可能超过刚过时了将DO与DONT分开是非常困难的。
我很高兴有任何提示。
更新:好的,我会尝试澄清我的问题是什么......
我认为最简单的方法是提供一些伪代码。
public static void Main()
{
// Start self-hosted WCF service (due to backwards compatibility, otherwise I'd go with katana/owin) on a worker thread
StartManagementHeadAsBackgroundThread();
// Stay alive forever
while(running)
{
// not sure what to put here. Maybe Thread.Sleep(500)?
}
// Ok, application is shutting down => somehow "running" is not true anymore.
// One possible reason might be: The management service's "Shutdown()" method is being called
// Or the windows service is being stopped...
WaitForAllChildrenToReachFinalState();
}
private static void StartManagementHeadAsBackgroundThread()
{
ThreadStarter ts = new ThreadStarter(...);
Thread t = new Thread(ts);
t.Start();
}
管理主管(= wcf服务)提供了一些方法
无论如何,我需要从“管理”服务(StartCommunicator方法)中生成新的后台线程。
public class Communicator
{
private MyStateEnum _state;
public Communicator(int port)
{
_state = MyStateEnum.Initializing;
// do something
_state = MyStateEnum.Ready;
}
public void Run()
{
while(true)
{
// again a while(true) loop?!
switch(_state):
{
case MyStateEnum.Ready:
{
// start TcpListener - wait for TCP packets to arrive.
// parse packets. If "OK" set next good state. Otherwise set error state.
}
}
if(_state == MyStateEnum.Error) Stop();
break;
}
}
public void Stop()
{
// some cleanup.. disposes maybe. Not sure yet.
}
}
public enum MyStateEnum
{
Initializing, Ready, WaitForDataFromDevice, SendingDataElsewhere, Done, Error
}
所以问题是我的方法是否会带我到任何地方,或者我是否完全走错了路。
我该如何实现这一目标?主题?任务?是(真)有效吗?如何从“管理服务”中与通信器实例进行交互?我正在寻找的是带注释的锅炉板解决方案:)
答案 0 :(得分:0)
我的建议是使用ASP.NET Web API服务并将Controller操作标记为异步。从那时起,尽可能使用Tasks,当您最终阻止IO时,不会阻止HTTP服务器。就个人而言,我会避免使用Threads,直到你完全确定你不能用Tasks完成同样的事情。
答案 1 :(得分:0)
我建议使用线程池。这将有助于管理资源并提高资源的使用效率。
就终止线程而言,线程池线程是后台工作线程,并且当您的服务停止时将终止,但是,从上面的描述中这是不够的。您的线程应始终能够接收要求终止的消息。