【问题标题】:Different behavior between Desktop App and Service App桌面应用程序和服务应用程序之间的不同行为
【发布时间】:2012-09-18 21:04:39
【问题描述】:

我遇到了最奇怪的问题。

在我的 C# 解决方案中,我有一个桌面测试应用程序和一个服务应用程序。在启动两个应用程序时,我调用完全相同的方法,但行为完全不同。 我的桌面应用程序运行良好,读取 COM 端口,处理该信息,然后将该数据插入我的数据库。 服务应用程序,读取 COM 端口正常,但随后对数据的处理完全不同,之后它抛出一个 SQLException,因为它试图转换错误的数据(特别是 datetime '01/01/0001')

我需要这个应用程序成为一个服务,我有桌面应用程序只是为了测试它。我从事服务工作已有一段时间了,以前从未见过这种行为。

使用完全相同的库调用相同的函数时,应用程序和服务的工作方式怎么可能如此不同?

代码如下:

  • 服务:

    protected override void OnStart()
    {
                    csGPS.startGPSData();
    
        Thread hiloEscuchar = new Thread(delegate()
            {
                csListener listener = new csListener();
                listener.listenAutoCommand();
            });
        hiloEscuchar.Start();
    
    
        Thread hiloEnviar = new Thread(delegate()
            {
                csSender.buscarComandos();
            });
        hiloEnviar.Start();
    
    
        Thread hiloEnviarPosiciones = new Thread(delegate()
        {
            csSender.enviarPosiciones();
        });
        hiloEnviarPosiciones.Start();
    }
    
  • 桌面应用:

    private void btnComenzar_Click(object sender, EventArgs e)
    {
        csGPS.startGPSData();
    
        Thread hiloEscuchar = new Thread(delegate()
            {
                csListener listener = new csListener();
                listener.listenAutoCommand();
            });
        hiloEscuchar.Start();
    
    
        Thread hiloEnviar = new Thread(delegate()
            {
                csSender.buscarComandos();
            });
        hiloEnviar.Start();
    
    
        Thread hiloEnviarPosiciones = new Thread(delegate()
        {
            csSender.enviarPosiciones();
        });
        hiloEnviarPosiciones.Start();
    
        lblEstado.Text = "STARTED";
        btnComenzar.Enabled = false;
    
    }
    

希望你们能帮帮我。

谢谢。

【问题讨论】:

  • “数据处理完全不同”是什么意思。你不是说代码是一样的吗?你能在你注意到第一个差异的地方标记代码吗?
  • 您向我们展示的代码并不真正相关。在您的方法中的某个地方,正在对作为服务运行时无效的权限或上下文做出假设。您必须附加到服务并逐步查看发生了什么。您也可以尝试在您的用户帐户下运行该服务作为故障排除步骤,以查看它是否正常工作。

标签: c# .net service desktop-application


【解决方案1】:

虽然代码可能相同,但服务在完全不同的安全环境下运行。它们通常在LocalSystem 用户下运行,并且无法访问桌面。这种用途也有非常有限的网络访问权限。

您需要将代码作为服务进行调试,或者至少添加一些调试日志语句来尝试找出不同的行为。

【讨论】:

  • 我认为问题可能出在区域配置上。奇怪的是我的桌面应用程序运行良好,而我的服务却不行。我的服务是否有可能在与我的桌面应用不同的区域配置下运行?
  • 是的。只需使用默认格式记录当前日期和时间,您就会发现差异。
  • +1 您引导他找到答案,而不是发表评论并给您支票,他自己发布了答案。
  • 我在阅读您的答案之前解决了问题,这就是我自己发布答案的原因。这不是新手的事情,就像发生的那样......我认为你有点急于回答......无论如何,我非常感谢你的帮助......我无意产生任何问题...... . 只是为了帮助和为这个伟大的论坛做出贡献。
【解决方案2】:

“01/01/0001”是有效的 .NET 日期,但不是有效的 MS SQL 日期。

您可能没有使用 MSSQL,但任何数据库都有有效的日期范围。

SQL 上的日期时间是 1753 年 1 月 1 日到 9999 年 12 月 31 日

SmallDateTIme 是 1900 年 1 月 1 日到 2079 年 6 月 6 日

我总是检查之前的日期范围并插入。

【讨论】:

  • 是的,我明白了,我用那个日期时间的例子来解释发生了什么。这是我的数据没有被正确处理的连续性。我的桌面应用程序没有出现错误。
  • 然后隔离数据值是否出错并发布该行代码。为什么要向数据库提交无效数据?
【解决方案3】:

问题已解决。出于某种原因,我的服务使用的 CultureInfo 与我的桌面应用程序使用的不同。

似乎桌面应用程序使用在区域配置中设置的默认 CultureInfo,而服务应用程序由于某种原因不使用。

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多