重複の可能性:
メソッドを再帰的に呼び出す(オブジェクトの再利用を目的として)
たくさんのフィールド(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は別のスレッドで実行する必要があります)