在某些代码中
for (int i = 0; i < length; i++) //each iteration in another task
{
Method2();
}
//Task.WaitAll()
public void Method2()
{
Method3();
}
public void Method3()
{
Method4();
}
public void Method4()
{
process1.Start(); //this process take a lot of time so next iteration/next task should start in this place
}
我想在其他线程中运行每次迭代,但不是全部在一次。一个线程应该转到Method4(),运行它,然后等待结束这个过程。后来另一个具有相同行为的线程等。在Task.WaitAll()程序中应该等待所有线程。
怎么做? 2一次迭代中的任务,ContinueWith还是......?/ / p>
答案 0 :(得分:1)
不要打扰。
所有迭代都会很快结束执行Method4(),并且您需要单线程。
在该约束下,这根本不是任务或线程的场景。
但假设Method2()和/或Method3()中发生了重大事件,您可以用for()
替换Parallel.For()
循环,并在Process代码周围使用简单的lock
:
private static object processLock = new object(); // probably static
public void Method4()
{
lock(processLock)
{
process1.Start();
}
}
但是现在你必须防止TPL创建太多线程。 (在Parallel.For中使用DegreeOfParallelism)。
答案 1 :(得分:0)
如果我理解正确你想在paraller中运行所有这些进程,但你想限制多少进程同时运行?为此,您可以使用限制并发性的信号量(但要注意所有线程都将在整个时间内挂起 - 因此将它们标记为LongRunning)。
另一件事是你必须在Method4中等待进程退出。
static SemaphoreSlim semaphore = new SemaphoreSlim (3); // Capacity of 3
List<Task> tasks = new List<Task>();
for (int i = 0; i < length; i++) //each iteration in another task
{
tasks.Add(Task.Factory.StartNew(() =>
{
Method2();
},
TaskCreationOptions.LongRunning);
}
Task.WaitAll(tasks)
public void Method2()
{
Method3();
}
public void Method3()
{
Method4();
}
public void Method4()
{
semaphore.Wait();
process1.Start();
process1.WaitForExit();
semaphore.Release();
}