2
void Method1(object sender, DoWorkEventArgs e)
{
    var list1 = (List<some objects>)e.Argument;
    var list2 = new List<WaitHandle>();

    foreach (var thing in list1)
    {
        var ws = new ManualResetEvent(false);
        list2.Add(ws);
        dispatcher.BeginInvoke(DispatcherPriority.Background,
            new RunDelegate(Method2), thing, ws);
    }

    WaitHandle.WaitAll(list2.ToArray());

    ConvertList1ToPDF(list1);
}

// ------------------------------------------------------------------

void Method2(Thing thing, ManualResetEvent handle)
{
    var class = thing;
    Class.RenderImages();
    PDFCount++; 
    UpdateStatusMessage("Do something " + PDFCount + " of " +
        NumberofPfdToCreate.Count() + " compounds");

    handle.Set();
}

メモリを解放しない複数のスレッドに問題があります。データ オブジェクトから PDF チャートを作成しています。

配置は、データ オブジェクトをループすることです。データ オブジェクトごとに を作成し、ManualResetEventに追加しlist2ます。次に、ディスパッチャーを で開始し、オブジェクトをパラメーターとしてBeginInvoke渡します。ManualResetEvent

次にWaitHandle.WaitAll(...)、すべてWaitHandleの s があります。

問題は、メモリが解放されていないことです。最終的に「メモリ不足」の例外が発生するまで、それは蓄積されます。

私は必ずしも解決策を探しているわけではありません。問題が何であるかを誰かがよく知っているかどうかを探しているだけです。

WPF 3.5 で実行しています。

ありがとう

4

1 に答える 1

2

ManualResetEventはIDisposableを実装しているため、終了したらそれらを破棄する必要があります。この場合、Method1が終了したら、それらをすべてクリアします...メソッドの最後に以下を追加します

void Method1(object sender, DoWorkEventArgs e)
{
    ...

    foreach(ManualResetEvent mre in list2)
        mre.Dispose();   
}

これにより、ManualResetEventによって使用されている管理されていないリソースを正しく解放できるようになります。

他の方法をチェックして、そこにあるIDisposableアイテムも解放されていることを確認する必要があります。あなたの例で考えられる原因は、ConvertList1ToPDFとRenderImagesです。

于 2012-05-29T10:13:04.607 に答える