如何在C# Task.Factory.StartNew中等待几秒钟

3

我有一个创建多个任务的函数,使用Task.Factory.StartNew

public void MultipleThread(List<string> list)
{
    List<Task> listTask = new List<Task>();
    foreach (string item in list)
    {
        listTask.Add(Task.Factory.StartNew(() => SetAddress(item)));
    }
    Task.WaitAll(listTask.ToArray());
}

如何在继续执行下一个任务之前等待几秒钟?


2
你应该使用Task.Run()而不是Task.Factory.StartNew。另外,你想要什么并不清楚 - 你想要在下一个foreach循环迭代之前延迟吗?还是你想要在Task内部延迟? - Herohtar
我必须等待所有任务完成,因此我使用Task.Factory.StartNew而不是Task.Run()。我想在foreach循环的下一次迭代之前延迟。 - Kerwen
2
当使用Task.Run时,您可以完全以相同的方式等待任务。如果您只是想在循环内部延迟,则需要使用Thread.Sleep - Herohtar
1个回答

4

你可以使用另一个 WhaitAll 选项,它接受两个参数:任务数组和毫秒超时时间。

public static bool WaitAll (System.Threading.Tasks.Task[] tasks, int millisecondsTimeout);



public void MultipleThread(List<string> list)
{
    List<Task> listTask = new List<Task>();
    foreach (string item in list)
    {
        listTask.Add(Task.Factory.StartNew(() => SetAddress(item)));
    }
    Task.WaitAll(listTask.ToArray(), 50000);
}

我希望这解决了你的问题。

* 更新 *

为了使每个任务运行之间有间隔, 您可以使用静态的TimeSpan.FromMilliseconds

Task t = Task.Run( () => {} ); 
TimeSpan ts = TimeSpan.FromMilliseconds(150);
if (! t.Wait(ts))
Console.WriteLine("The timeout interval elapsed.");

1
这完全是错误的。你混淆了任务等待超时(这是您的程序在取消任务之前等待“任务”完成的最长时间)与延迟时间(这是程序在继续下一条语句之前等待的绝对时间)。你的第二个例子根本不会等待,因为这个空任务将立即完成。适当的延迟选项是Thread.Sleep()Task.Delay(),具体取决于你是否编写异步代码。 - Herohtar
1
对于第一个例子,你是正确的,我很困惑,感谢你的描述。 - Shrembo
这个任务只是为了举例而已 ;) - Shrembo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接