1

外部アプリケーションからメッセージを受信するスレッドを使用しています。そのため、スレッドは常に生きています。

アプリケーションが終了するまで、スレッドをアプリケーション全体で実行したいと考えています。現在、windows アプリケーション c# のスタートアップである program.cs で自分のスレッドを呼び出しています。私がそれをどのように行っているかを知るには、以下のコードを参照してください。

以下のコードを使用すると、アプリケーションの起動時にスレッドが起動します...しかし、スレッドが外部アプリケーションから1つのメッセージを受信した後、何らかの方法で中止されます。

私の質問が明確であることを願っています。助けてください。ありがとう。


  static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        StartThread();
        Application.Run(new Screensaver());
    }
    public static void StartThread()
    {
            DeamonEngine Deamon = new DeamonEngine();
            Thread ThreadReciever = new Thread(Deamon.Receiver);
            if (!(ThreadReciever.IsAlive))
            {
                ThreadReciever.Start();
            }
        }
    }

コメントから:

    void Receiver() { 
        try { 
            Initiate socket s; 
            Bind Ip address; 
            s.Receiver[bytes]; 
            Access the members of message received in bytes;
            Assign the members of message to local variable;
            Read Xml File, get the node values and write to batch file; 
            Execute batch file. 
        } 
        catch { } 
    }
4

4 に答える 4

2

通常、DaemonReceiverには次のようなコードがあります

while (!quit) 
{
  --- do work ---
  Thread.Sleep(1000);
}

quitこれにより、メインスレッドでグローバル変数を設定するまでスレッドが存続します。

また、例外がスレッドから漏れないようにすることが非常に重要です。これらの例外はどこにも報告されず、おそらく現在発生しているサイレントエラーが発生します。すべてをキャッチし、少なくともそれについて報告します。

于 2009-06-25T05:18:31.753 に答える
2

起動コードは問題ないようです。私の予想では、何か問題があるかDaemonEngine.Receiver()、おそらく例外がスローされているか、関数自体が 1 つのメッセージのみを処理するように構成されている可能性があります...正確な関数を見ないと、それを言うのは困難です。

編集:

私のコメントから私のものを取り出すには:

あなたのスレッドを殺すために何かが間違っています。例外、論理エラーです。スレッド内で何が起こっているかを示すコードがないため、何とも言えませんが、何かが起こっています。スレッドを実行し続けるのではなく、スレッドを実行するだけの投稿済みのコードとは関係ありません

また、投稿したコードから、例外があったという事実を単に捨てているだけです...手元にリンクはありませんが、そのような例外を飲み込むのは恐ろしいことです. 特に、とにかく通常のように表示されないスレッド内では。

いかなる種類のループも示されていないため、問題を引き起こしているのは上記の私の提案の 1 つまたは両方である可能性があります。

于 2009-06-25T05:02:51.287 に答える
2

スレッドに Receiver メソッドを実行させても、スレッドがメソッドを繰り返し実行するわけではありません。

問題の処理コードを考えると、処理Daemon.Receiverする次のメッセージを戻って取得できるように、ループで実行する必要があります。次のようになります。

void Receiver() { 
    while(!done) // without this loop, only one execution will occur
    {
        try { 
            // do stuff
        } 
        catch { 
            // log/handle error
        } 

        // wait for next message
    }
}
于 2009-06-25T05:05:00.757 に答える
0

スレッドで例外が発生している可能性がありますが、これはキャッチされていません。実行中のメソッドに try-catch を入れてみて、例外が発生するかどうかを確認してください。

于 2009-06-25T05:03:23.567 に答える