0

我遇到了最奇怪的问题。

在我的 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;
    
    }
    

我希望你们能帮助我。

谢谢。

4

3 回答 3

3

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

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

于 2012-09-18T21:12:31.240 回答
0

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

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

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

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

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

于 2012-09-18T21:10:57.060 回答
0

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

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

谢谢你的帮助。

于 2012-09-18T22:08:32.283 回答