Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使任务同时运行_C#_Multithreading_Task - Fatal编程技术网

C# 使任务同时运行

C# 使任务同时运行,c#,multithreading,task,C#,Multithreading,Task,我试图不间断地连续运行几个任务。 这是我的密码: int maxThread = 100; Task[] tasks = new Task[maxThreads]; while(true) { for(int i = 0;i<maxThreads;i++) { tasks[i] = new Task.Factory.StartNew(someTask); } Task.WaitAll(tasks); } 因此,此函数将等待所有任务完成,并运行下一批任务。

我试图不间断地连续运行几个任务。 这是我的密码:

int maxThread = 100;
Task[] tasks = new Task[maxThreads];
while(true)
{
   for(int i = 0;i<maxThreads;i++)
   {
     tasks[i] = new Task.Factory.StartNew(someTask);
   }
   Task.WaitAll(tasks);
}
因此,此函数将等待所有任务完成,并运行下一批任务。但我希望在一项任务完成后立即开始一项任务,而不必等待其他任务

谢谢

我会使用信号量lim


使用Parallel.ForEach和var po=new ParallelOptions{MaxDegreeOfParallelism=100};可以是另一种选择。但是Parallel.ForEach不能保证它将使用100个任务。

我想使用这个。将任务附加到其父级;这很容易。像这样

Task t1 = new Task(()=>{
    // put your children tasks here.
    Task.Factory.StartNew(()=>{}, TaskCreationOptions.AttachedToParent);
});

t1.RunSynchronously();

// then start your next batch tasks.

@Ramhound,我认为你错了。任务负责管理自己的线程。您不应该在不同的线程中启动每个任务。为什么一个任务会在其所有兄弟线程在此解决方案中结束之前启动?他可能有批短期运行的任务要按顺序运行。@Capripio否,因为信号量用于将并发任务的数量限制为100。所以我可以这样写:int maxThread=100;SemaphoreSlim sem=新的SemaphoreSlimmaxThread;任务[]任务=新任务[maxThreads];whiletrue{forint i=0;i sem.Release;}Task.WaitAlltasks;}@卡普里奥不,没有sem,等等。上面的代码所做的是:它创建100个任务,每当运行的任务少于100个时,它就会创建一个新任务。但当所有任务在一个任务结束后不久完成时,它也会工作@卡普里奥对不起,我不明白。。如果你说的是等待所有任务完成后再开始新任务,那么不是。一个任务完成后,它就会开始一个新任务。
Task t1 = new Task(()=>{
    // put your children tasks here.
    Task.Factory.StartNew(()=>{}, TaskCreationOptions.AttachedToParent);
});

t1.RunSynchronously();

// then start your next batch tasks.