我有一个Windows服务项目,其OnStart方法,我从这样的参考WCF服务调用函数 -
var factory = new ChannelFactory<MySolution.IDataService>("BasicHttpBinding_IDataService");
MySolution.IDataService client = factory.CreateChannel();
Task.Factory.StartNew(() => client.GetData()).Wait();
托管之后,当我尝试启动该服务时,它会抛出“已启动然后停止”的错误。我调试并发现最后一行(使用Wait调用)导致服务中断。这可能是什么原因?如何解决?
提前致谢。
EDIT1
根据建议,我将GetData代码移动到另一个用计时器调用的函数 -
OnStart(){
....
....
System.Timers.Timer _timer = new Timer(60 * 1000);
_timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
_timer.Start();
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Task.Factory.StartNew(() => client.GetData()).Wait();
}
现在服务正在启动但是没有调用timer_Elapsed函数,或者可能是它,但函数再次失败。该功能在调试模式下正常工作。你能说出这是不是正确的方法吗?
答案 0 :(得分:0)
启动Windows服务时,您需要确保OnStart
方法及时返回&#34;方式。这意味着它无法在实际方法本身中启动长时间运行的任务。
在您的情况下,您需要做的是将代码放入一个线程并从OnStart
方法启动线程。
答案 1 :(得分:0)
根据评论调试,服务结果表明WCF调用失败。吞没了错误,这是最近.NET版本中未观察到的Task
异常的默认行为。
OnStart
方法。例如:
Task.Run(() => {
try {
client.GetData();
}
catch (Exception ex) { Log(ex); }
});