Windows服务启动然后停止,无法弄清楚bug

时间:2013-01-11 17:27:47

标签: c# .net xml windows-services webrequest

我尝试以固定间隔读取文件,然后将查询的数据发送到特定的Web服务器。以下是我正在使用的代码,但服务启动和停止而不做任何事情。我无法弄清楚这个错误。

public partial class IPTProjectService : ServiceBase
{
    private Thread checkingThread;
    private System.Timers.Timer timer;
    Boolean sendingTime;

    public IPTProjectService()
    {
        InitializeComponent();

        checkingThread = new Thread(update);
        timer = new System.Timers.Timer(Properties.Settings.Default.TIMEINTERVAL);
        timer.Elapsed += timer_Elapsed;
        sendingTime = true;
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        setSendingTime();
        if (!File.Exists("Testfile.txt"))
        {
            File.Create("Testfile.txt");
            timer_Elapsed(sender, e);
        }
        else
        {
            File.WriteAllText("Testfile.txt", timer.ToString());
        }
    }

    private void setSendingTime()
    {
        sendingTime = true;
    }

    private void update()
    {
        while (true)
        {
            if (sendingTime)
            {
                CarpoolWebClient.sendData(Properties.Settings.Default.DATAFILE);
                sendingTime = false;
            }
        }
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            timer.Start();
            checkingThread.Start();
        }
        catch (Exception ex)
        {
            Debug.Fail(ex.ToString());
        }

    }

    protected override void OnStop()
    {
        try
        {
            timer.Stop();
            checkingThread.Abort();
        }
        catch(Exception e)
        {
            StreamWriter writer = new StreamWriter("testfile.txt", true);
            writer.Write(e.ToString());
            writer.Close();
        }
    }
}

class CarpoolWebClient
{
    public static void sendData(String fileName)
    {
        WebRequest req = null;
        WebResponse rsp = null;

        try
        {
            //URL of message broker
            string uri = "http://localhost/IPTProject/receive_xml.php";
            req = WebRequest.Create(uri);
            req.Method = "POST";
            req.ContentType = "text/xml";

            // Wrap the request stream with a text-based writer
            StreamWriter writer = new StreamWriter(req.GetRequestStream());
            // Write the xml text into the stream
            writer.WriteLine(GetTextFromXMLFile(@fileName));
            writer.Close();
            rsp = req.GetResponse();

        }
        catch (WebException webEx)
        {
            //MessageBox.Show(webEx.Message);
            throw webEx;
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
            throw ex;
        }
        finally
        {
            if (req != null) req.GetRequestStream().Close();
            if (rsp != null) rsp.GetResponseStream().Close();
        }
    }

    private static string GetTextFromXMLFile(string file)
    {
        StreamReader reader = new StreamReader(file);
        string ret = reader.ReadToEnd();
        reader.Close();
        return ret;
    }
}

5 个答案:

答案 0 :(得分:1)

如果可以,请调试服务。如果这是一个问题,因为服务设置为自动启动,那么你可以使用这个“技巧”到automatically attach the debugger并找出出错的方式。

答案 1 :(得分:0)

致电

File.Create("Testfile.txt");
timer_Elapsed(sender, e);

将创建一个文件并将FileStream返回给新创建的文件。此文件随后仍处于打开状态,然后调用timer_Elapsed并导致应用程序失败,因为它无法再次打开文件。请参阅主题的MSDN Docs

您的代码不需要Create调用,您可以简单地将方法添加到下面的示例中,它应该可以解决此问题。或者,关闭FileStream对象。

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    setSendingTime();
    File.WriteAllText("Testfile.txt", timer.ToString());
}

File.WriteAllText将创建文件,如果它不存在,并覆盖该文件(如果它存在),实际上与您的检查相同。

如果这不能解决问题,请检查事件日志中的错误,或者在记录错误消息的timer_Elapsedupdate方法中提供错误处理代码。

答案 2 :(得分:0)

当我在我自己的计算机上请求网络服务器,即localhost时,我没有注意到wampserver没有运行。我查看了显示WebException的事件日志。启动wampserver代码工作正常。谢谢大家。

答案 3 :(得分:0)

是的,我经常遇到类似的问题......

  1. 记录所有未捕获的异常:

        // Somewhere at the start of the constructor:
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    
    [...]
    
    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // Log exeption e.ExceptionObject.ToString to a file
    }
    
  2. 另外,我会在update方法中使用try-catch + log来确保如果线程因任何未知原因退出,你会发现原因。

  3. 如果这些东西不起作用,它通常会像丢失的DLL,不正确的DLL版本(64/32位混合)或类似的东西一样愚蠢。这可以在事件日志中找到。

  4. 应该这样做: - )

答案 4 :(得分:0)

如果您在安装了Visual Studio的计算机上运行此程序(例如,您的开发计算机),请添加对

的调用
System.Diagnostics.Debugger.Launch();

在你的创业公司或适当的地方。这将启动Visual Studio调试器,因此您不必解决计时问题(在手动连接调试器之前服务停止)