0

一定の間隔でファイルを読み取ってから、クエリされたデータを特定の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;
    }
}
4

5 に答える 5

1

可能であれば、サービスをデバッグします。サービスが自動的に開始するように設定されているために問題が発生した場合は、この「トリック」を使用してデバッガーを自動的に接続し、その方法で何が問題になっているのかを把握できます。

于 2013-01-11T17:34:29.787 に答える
0

への呼び出し

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

FileStreamファイルを作成し、新しく作成されたファイルに戻ります。このファイルはその後も開いたままtimer_Elapsedで呼び出され、ファイルを2回開くことができないため、アプリケーションが失敗します。この件については、 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

自分のコンピューター、つまりローカルホストでWebサーバーを要求していたので、wampserverが実行されていないことに気づきませんでした。WebExceptionを示したイベントログを確認しました。wampserverコードの起動は正常に機能します。みんなありがとう。

于 2013-01-11T18:21:06.640 に答える
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ビットミックス)などの愚かなものです。これは、イベントログで確認できます。

それはそれをする必要があります:-)

于 2013-01-12T14:53:08.457 に答える
0

Visual Studioがインストールされているマシン(開発マシンなど)でこれを実行している場合は、次の呼び出しを追加します。

System.Diagnostics.Debugger.Launch();

スタートアップまたは適切な場所で。これにより、Visual Studioデバッガーが起動するため、タイミングの問題と戦う必要はありません(デバッガーを手動で接続する前にサービスを停止します)

于 2013-01-12T15:26:24.553 に答える