使用Task控制线程

时间:2011-05-25 11:29:56

标签: c# multithreading .net-4.0 parallel-processing multitasking

在某些代码中

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>

2 个答案:

答案 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();
}