0

スレッド内にスレッドがあり、最後のサブスレッドがハングして、20 時間何もスローしません。私のコードは次のようなものでした:

bool end = false;

var t1 = new Thread(() =>
{
    // ...

    var t2 = new Thread(() =>
    {
        try
        {
            foreach(Data data in datas2)
            {
                foreach(SubData subdata in data.SubDatas)
                {
                    var t3 = new Thread(() =>
                    {
                        this.SaveData(subdata.RetrieveData());
                    }); t3.Start();

                    if (!t3.Join(1800000))
                    {
                        t3.Abort();
                        throw new TimeoutException("The execution of method is taking too long.");
                    }
                }
            }
        } catch { throw; }
        finally { end = true; }
    }); t2.Start();
}); t1.Start();

finallyのブロックを通過するt2ことはなく、エラーもスローされません。ここで何が起きてるの?

私のコードは C#、フレームワーク 4、Visual Studio 2010 Pro でビルドされています。

助けてください。前もって感謝します。


編集:
ご協力いただきありがとうございます。私は答えを見つけました、そしてそれはです

無限ループ。

このばかげたバグのために、私たちの生産は 1 週間停止しました。うーん。私たちのシステムには、一部のデータのみに対して無限ループを作成する検証があるようです。この質問の解決に熱心に取り組んでくれてありがとう。

4

2 に答える 2

0

SaveDataまたはRetrieveDataで、私たちが知らないことが起こっている可能性があります。私たちが知らない非常に長い/反復的なI/Oを実行している可能性があります。

さらに、このコードはあなたが思っていることをしているとは思いません。私の//注を参照してください:以下:

            foreach(SubData subdata in data1.SubDatas)
            {
                var t3 = new Thread(() =>
                {
                    this.SaveData(subdata.RetrieveData());
                }); t3.Start();

                // NOTE: Here you are blocking each iteration of T2 
                // while T3 runs.  There is no reason to be running 
                // another thread here- just call SaveData/RetrieveData 
                // from T2.  Additionally, because this is executing in 
                // a double-nested loop, you might be doing this many, 
                // many times.  I'd suggest looking into ThreadPool or TPL.

                if (!t3.Join(1800000))
                {
                    t3.Abort();
                    throw new TimeoutException("The execution of method is taking too long.");
                }
            }
于 2012-06-01T03:58:45.463 に答える
0

これがあなたの場合の問題かどうかはわかりません....

ただし、 Thread.Abort は例外を発生させます (例外を発生させます (例外をキャッチしても、キャッチして最終的に終了すると、アボートをクリアしない限り、それ自体が自動的に再スローされます)。SaveData と RetriveData のコードが例外をキャッチし、キャッチ内または最終的にブロックされた場合、そのコードは中止されません。

于 2012-06-01T03:00:49.053 に答える