1

私はここや他の場所で多くの解決策を読みましたが、それを正しく理解することはできませんでした。聞いてみるだけでちょっと恥ずかしいけど…

私のコード:

private void btnStart_Click(object sender, EventArgs e)
        {
                MyClass SomeData = new MyClass()
                Thread ProcessThread = new Thread(c => StartService(SomeData));
                ProcessThread.Start();
        }

private void StartService(MyClass someData)
        {
            try
            {
                //System.Exception throws in this Execute method
                someData.Execute();
            }
            catch(Exception Ex)
            {
                Show(Ex);
//Informing me some exception occurred.
            }
        }

Excuteメソッドで例外がスローされた場合(現在、テストのために意図的にスローしています)、スレッドabortまたはendスレッドを起動して、同じメソッドを実行するためにANOTHERを開始することはできません。したがって、基本的に、そのスレッドを終了してから再実行したい場合。再実行が危険だと思われる場合は、再実行するか終了するかを人間が確認するのを待つ質問をします。とにかく、私はそれを終了することさえできず、スレッドはラインで何もしませんThread ProcessThread = new Thread(c => StartService(SomeData));

手伝っていただけませんか?

4

2 に答える 2

2

への呼び出し

Show(Ex);

UIアクションを暗示しているようです。それが当てはまり、Show()がそのUIアクションを適切にマーシャリングしない場合は、結果として未処理の例外がスローされている可能性があります。

その観察以外に、Show()が終了した後、スレッドのメソッドにはそれ以上のステートメントがないため、スレッドはそれ自体で終了する必要があります。スレッドを手動で終了するために何もする必要はありません(また、そうする必要もありません)。かなり珍しい状況を除いて、スレッドが自動的に終了するようにするのが最善です(場合によっては、スレッドに終了のシグナルを送信するか、この場合は、メソッドを実行して完了させます)。

あなたのcatchブロックでは、確かに新しいスレッドを開始することができます

Thread ProcessThread = new Thread(c => StartService(SomeData));

ProcessThreadどちらもメソッド内で定義されているため、これはコード内のスコープとは異なるスコープであることに注意してください。クラス全体でその変数にアクセスできるようにしたい場合は、おそらくそれをクラスメソッドにプロモートします。

于 2013-01-28T20:26:34.987 に答える
0

が完了するThreadとすぐに自動的に終了StartServiceします。あなたはそれを「終わらせる」ために何もする必要はありません。

新しいスレッドを開始したい場合は、メソッド内で直接実行できます。

    private void StartService(MyClass someData)
    {
        try
        {
            //System.Exception throws in this Execute method
            someData.Execute();
        }
        catch(Exception Ex)
        {
            Show(Ex);
            // "Restart" this thread
            (new Thread(c => StartService(SomeData))).Start();
        }
    }

ただし、スレッドが常に再起動しないように、ロジックを組み込むことを検討することをお勧めします。1つのオプションは、再起動された回数のカウンターを保持することです。2、3回以上再起動した場合は、ログ記録後に正常に終了します。これにより、すぐに発生する例外が、スレッドを絶えず出し入れするだけで発生するのを防ぐことができます...

于 2013-01-28T20:26:27.373 に答える