在Windows服务中调用OnStart上的Task.Wait

时间:2015-05-05 21:00:28

标签: c# wcf

我有一个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函数,或者可能是它,但函数再次失败。该功能在调试模式下正常工作。你能说出这是不是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

启动Windows服务时,您需要确保OnStart方法及时返回&#34;方式。这意味着它无法在实际方法本身中启动长时间运行的任务。

在您的情况下,您需要做的是将代码放入一个线程并从OnStart方法启动线程。

答案 1 :(得分:0)

根据评论调试,服务结果表明WCF调用失败。吞没了错误,这是最近.NET版本中未观察到的Task异常的默认行为。

  1. 添加错误处理,以便了解错误。
  2. 正确解锁OnStart方法。例如:
  3. Task.Run(() => {
     try {
      client.GetData();
     }
     catch (Exception ex) { Log(ex); }
    });
    
    1. 独立于服务和任务问题调试失败的WCF调用。他们与这个问题无关。这是一个标准的WCF错误,应使用Web上记录的常用技术解决。