C# 正在调用任务。在Windows服务中等待OnStart

C# 正在调用任务。在Windows服务中等待OnStart,c#,wcf,C#,Wcf,我有一个Windows服务项目,在它的OnStart方法中,我从引用WCF服务调用一个函数,如下所示- var factory = new ChannelFactory<MySolution.IDataService>("BasicHttpBinding_IDataService"); MySolution.IDataService client = factory.CreateChannel(); Task.Factory.StartNew(() => cl

我有一个Windows服务项目,在它的OnStart方法中,我从引用WCF服务调用一个函数,如下所示-

var factory = new ChannelFactory<MySolution.IDataService>("BasicHttpBinding_IDataService");
        MySolution.IDataService client = factory.CreateChannel();

Task.Factory.StartNew(() => client.GetData()).Wait();

现在服务正在启动,但没有调用timer_appeased函数,或者可能是调用了timer_appeased函数,但该函数再次失败。该函数在调试模式下工作正常。您能告诉我这是不是正确的方法吗?

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


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

根据调试服务的注释,WCF调用失败。错误被吞没,这是最近.NET版本中未观察到的任务异常的默认行为

添加错误处理,以便了解错误。 正确地取消阻止OnStart方法。例如:

独立于服务和任务问题调试失败的WCF调用。他们与这个问题无关。这是一个标准的WCF错误,应该使用web上记录的常用技术来解决。
好的,我把电话从OnStart删除了。你能检查一下我的编辑吗1.当你看起来想立即启动时,为什么要使用计时器?为什么要等待刚刚开始的任务?你能不能在OnStart中直接运行Task.Factory.StartNew=>client.GetData?@usr实际上,我需要在第一次运行后每分钟运行一次。由于Chris建议不要在OnStart中执行此操作,我将其完全移动到计时器功能。现在,即使服务正在启动,但GetData根本不会从计时器调用。不知道为什么。当我调试它时它会工作。@usr好的,我也按照你的建议做了。但它对我不起作用。编辑后,如果您不进行调试,它可能不起作用,因为您没有保存对_timer的引用,因此它将被垃圾收集。有,所以你可能想
   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();
    }
Task.Run(() => {
 try {
  client.GetData();
 }
 catch (Exception ex) { Log(ex); }
});