我一直在阅读很多关于Windows服务和线程的教程/帮助台(包括这个),以找出实现以下目标的最佳方法。我无法弄清楚一些事情,所以现在我想知道我是否选择了正确的方式去做,如果我做了,我该如何实现它。
目标: 我需要在后台执行5个单独的任务,所以我想创建一个Windows服务。除了服务,我想要一个表单应用程序来显示有关服务的信息。根据我的阅读,我应该使用套接字服务器来处理通信。
我的计划:
问题在于3,6和7,并且涉及“在其他线程/类上调用方法”。
简化服务:
public partial class SecurityCheck : ServiceBase
{
private ComServer _comServer;
private CheckRequest _checkRequest;
private readonly Thread[] _threads = new Thread[1];
private int _tNr;
public SecurityCheck()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_comServer = new ComServer();
}
protected override void OnStop()
{
_comServer.CloseSockets();
if (_checkRequest != null)
_checkRequest.ServiceStarted = false;
foreach (Thread t in _threads)
{
if (t != null)
t.Join(new TimeSpan(0, 2, 0));
}
}
internal void StartTasks()
{
_checkRequest = new CheckRequest { ServiceStarted = true };
var st = new ThreadStart(_checkRequest.ExecuteTask);
_threads[_tNr] = new Thread(st);
_threads[_tNr].Start();
_tNr++;
}
internal void SendData(string msg)
{
_comServer.SendData(msg);
}
}
简化任务
public class CheckRequest
{
public bool ServiceStarted;
public CheckRequest()
{
//construct me
}
public void ExecuteTask()
{
while (ServiceStarted)
{
try
{
//perform task
//what to do to send data?
}
catch (Exception ex)
{
}
// yield
if (ServiceStarted)
{
Thread.Sleep(new TimeSpan(0, 0, 10));
}
}
Thread.CurrentThread.Abort();
}
}
答案 0 :(得分:0)
对于服务和客户端之间的通信,我肯定会使用(双工)WCF而不是套接字。这将为您节省大量繁琐和错误的编码。
其次,使用executeTask方法为每个任务创建一个单独的类听起来像是来自Java世界或可运行的对象。在C#中,您可以将任务编码为单独的方法,并将其作为task be executed asynchronously启动。当他们有东西向客户报告时,他们可以通过客户端和服务器之间的双工通道send it to the clients自己。
在这个项目中使用WCF和TPL几乎可以解决您描述的所有问题,并让您及时回家吃饭。现在可能花费一点时间来获得这些新技术,但它可以通过更短的代码更容易转移并减少错误空间来节省大量时间。
关心Gert-Jan