【问题标题】:Windows service exits with code 0 and no errors even though it hasn't done its thingWindows 服务以代码 0 退出并且没有错误,即使它没有完成它的事情
【发布时间】:2016-10-26 13:39:25
【问题描述】:

我有一个调用 Web API 服务的 Windows 服务。所有 API 调用都已经过测试并且可以正常工作。

服务会运行一段将数据发送到 API 的特定代码。它应该返回并继续循环。它所做的只是停下来。 JSon 已通过 fiddler 发送到 API,并且工作正常。

这是有问题的代码:-

public async Task<WorkOrderCreationResponseDto> ImportWorkOrders(WorkOrderCreationRequestDto request)
    {
        try
        {

            WorkOrderCreationResponseDto resp = await RestClient.PostAsync<WorkOrderCreationRequestDto, WorkOrderCreationResponseDto>(string.Format("{0}/WorkOrders", Resource), request);

            return resp;
        }
        catch (Exception ex)
        {

            throw ex;
        }


    }

现在代码进入等待行。此时代码以代码 0 退出。它永远不会返回并且不会在 catch 中捕获任何错误。

任何人都可以解释为什么会发生这种情况,因为我在早上在谷歌上兜圈子试图弄明白这一切之后完全不知所措。

任何能对此有所启发的东西都将不胜感激。

环境是Windows 10周年更新和Visual Studio 2015。我们用c#编码。

谢谢 史蒂夫

针对评论添加

我们在下面的代码中构建了一个数据对象 wo。 _rest 包含 API 的用户凭据。

using (SopImportDataService service = new SopImportDataService(_rest))
                            {
                                string jsonString = JsonConvert.SerializeObject(wo);

                                //WorkOrderCreationResponseDto c = await service.ImportWorkOrders(wo);

                                await service.ImportWorkOrders(wo);

                                Console.WriteLine("");
                            }

【问题讨论】:

  • ImportWorkOrders 怎么叫?
  • 嗨 Glorin,我在问题中添加了另一个代码 sn-p。
  • 也许我应该以不同的方式处理它:听起来好像在调用堆栈的某个地方没有等待某些东西,并且一旦您的异步方法产生当前线程,您的程序就会退出。
  • 我脑子里很清楚,相信我这可能是一个可怕的地方,如果我从它停止的点向后工作,可能会在某个地方缺少等待呼叫?
  • 这是我从描述中的猜测。可能的地方是你的主循环。如果您错过了等待/等待,那么一旦您的异步方法之一产生线程,您的主循环就会启动,就好像您的异步方法已经完成一样。如果这允许您的程序满足其退出条件,那么您很可能会看到程序退出时没有错误但从未完成异步调用。

标签: c# json windows api service


【解决方案1】:

感谢 Glorin 为我指明了正确的方向。问题是 Progrm.cs 文件中的 Main 不是 Async。我们使用了 Stephen Cleary 的 AsyncEx 库,并将 program.cs 更改为如下所示:-

static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        try
        {
            AsyncContext.Run(() => MainAsync());
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex);
        }
    }

    static async Task MainAsync()
    {
#if (!DEBUG)
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new UnityService()
        };
        ServiceBase.Run(ServicesToRun);
 #else
        UnityService myServ = new UnityService();
        //myServ.SetupService().ConfigureAwait(true);

        await myServ.BeginService();
#endif
    }

这些变化似乎解决了棘手的问题。

再次感谢大家

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-02-02
    • 2019-12-31
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多