0

我试图以恒定的时间间隔读取文件,然后将查询的数据发送到特定的网络服务器。以下是我正在使用的代码,但是服务启动和停止没有做任何事情。我无法弄清楚错误。

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;
    }
}
4

5 回答 5

1

如果可以,请调试服务。如果因为服务设置为自动启动而出现问题,那么您可以使用此“技巧”自动附加调试器并找出问题所在。

于 2013-01-11T17:34:29.787 回答
0

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

于 2013-01-11T18:21:06.640 回答
0

呼吁

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

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

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

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

File.WriteAllText如果文件不存在,将创建该文件,如果文件存在则覆盖该文件,有效地执行与您的检查相同的操作。

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

于 2013-01-11T17:35:28.480 回答
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. 另外,我会在更新方法中使用 try-catch + log 来确保如果线程因任何未知原因退出,您会找出原因。

  3. 如果这些东西不起作用,通常是因为缺少 DLL、DLL 版本不正确(64/32 位混合)或类似的东西。这可以在事件日志中找到。

应该这样做:-)

于 2013-01-12T14:53:08.457 回答
0

如果您在安装了 Visual Studio 的机器上运行它(例如,您的开发机器),请添加对

System.Diagnostics.Debugger.Launch();

在您的初创公司或任何适当的地方。这将启动 Visual Studio 调试器,因此您不必解决时间问题(在您可以手动附加调试器之前服务停止)

于 2013-01-12T15:26:24.553 回答