1

重複の可能性:
メソッドを再帰的に呼び出す(オブジェクトの再利用を目的として)

たくさんのフィールド(10+)、巨大な配列(100kb)、および長時間実行されるタスクを処理するいくつかのアンマネージリソースを含むかなり大きなクラスがあり、タスクが完了するたびに何度も再利用したいと考えています。以下のコードは状況を示しています。

class ResourceIntensiveClass
{
    private object unmaganedResource; //let it be the expensive resource
    private byte[] buffer = new byte[1024 * 100]; //let it be the huge managed memory
    public Action<ResourceIntensiveClass> OnComplete;


    private void DoWork(object state)
    {
        //do long running task
        OnComplete(this); //notify callee that task completed so it can reuse same object for another task
    }

    public void Start(object dataRequiredForCurrentTask)
    {
        ThreadPool.QueueUserWorkItem(DoWork, dataRequiredForCurrentTask); //initate long runnig work
    }
}


class Program
{
    static object[] taskData = { "foo", "bar"};
    static int currentTaskIndex = 0;

    private static void OnCompleteHandler(ResourceIntensiveClass c)
    {
        currentTaskIndex = currentTaskIndex + 1;
        if (currentTaskIndex == taskData.Length)
        {
            Console.WriteLine("finished all task");
            return;
        }
        object data = taskData[currentTaskIndex];
        c.Start(data);
    }

    public static void Main()
    {
        ResourceIntensiveClass c = new ResourceIntensiveClass();
        c.OnComplete = OnCompleteHandler;
        object data = taskData[currentTaskIndex];
        c.Start(data);
    }

}

ここでの問題は、すべてのタスクが完了した後、DoWorkが戻らないことです。これにより、ある時点以降にストックオーバーフローが発生します。ThreadPoolでOnCompleteの呼び出しをキューに入れて、DoWorkを返させ、ランタイムに呼び出しスタックをクリアさせることができますが、余分なリソースを使用したくありません。私にとって最良の選択肢は何でしょうか?(タスクの進行が線形であると仮定します)(DoWorkは別のスレッドで実行する必要があります)

4

0 に答える 0