1

4 つの異なるジョブを並行して実行しているアプリケーションがあります。並列タスク ライブラリを使用します。

コードは次のようになります。

while (true)
        {
            var fetch = new FetcherHandler();

            var tasks = new Task[4];

            tasks[0] = Task.Factory.StartNew(fetch.GetJobs);

            tasks[1] = Task.Factory.StartNew(fetch.GetStatusNew);

            tasks[2] = Task.Factory.StartNew(fetch.GetJobsForStatus);

            tasks[3] = Task.Factory.StartNew(fetch.GetStatusOld);
            Task.WaitAll(tasks);

            Thread.Sleep(10000);
        }

これら 4 つのタスクはすべて終わりのないループにあるため、上記の thread.Sleep には到達しません。最初のタスクのコード例:

public void GetJobs()
        {
    while (true)
            {
                try
                    {
                        handler.GetNewJob();
                        }
                    catch (Exception exception)
                    {
                            var mail = new MailService();
                            mail.SendExeption("Error has accured in GetJobs", exception);
                            throw;
                        }
                    }
                }
                Thread.Sleep(15000); }}

上記のコードはうまく機能し、いくつかのジョブを実行してから 15 秒間スリープしてから、再び実行します。例外が発生すると問題が発生します。

例外は問題なくキャッチされ、メールが送信されますが、スレッドは例外の後のループで継続しないため、GetNewJob() メソッドが再度実行されることはありません。

例外が発生したときにスレッドに何が起こるか、スレッドを「保存」して続行できるようにする方法はありますか?

4

2 に答える 2

2

例外がthrowあるため、例外はスタックの最上位に伝播し、ソーススレッドの実行を中断します。

catch (Exception exception)
{
    var mail = new MailService();
    mail.SendExeption("Error has accured in GetJobs", exception);
    throw; //THIS LINE !
}

イベントを使用してExceptionCaught(..)、プログラム内でイベントを発生させ、そのイベントをリッスンすることができます。

于 2012-04-16T08:37:51.710 に答える
1

throw;catch句の最後にあるを削除するだけです。

MSDNから:

throwステートメントをcatchブロックで使用して、catchステートメントによってキャッチされた例外を再スローできます。

したがって、キャッチされた例外を再スローすると、スレッドが中断され、二度と実行されなくなります...

詳細:.NETスレッドが例外をスローするとどうなりますか?

于 2012-04-16T08:36:50.257 に答える