给定以下代码,是否可以为Task doThing
的实例定义调度程序,创建和延续设置?如何计划任务以使它们不同时运行,包括异步延续
我希望能够安排doThing
的多个实例,以便它们实际上仅从其他实例运行(即使它们正在等待其他子任务)。
private static async Task doThing(object i)
{
Console.WriteLine("in do thing {0}", (int)i);
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("out of do thing {0}", (int)i);
}
static void Main(string[] args)
{
CancellationTokenSource source = new CancellationTokenSource();
ConcurrentExclusiveSchedulerPair pair = new ConcurrentExclusiveSchedulerPair(TaskScheduler.Current);
Task Task1 = Task.Factory.StartNew((Func<object,Task>)doThing, 1, source.Token, TaskCreationOptions.AttachedToParent, pair.ExclusiveScheduler).Unwrap();
Task Task2 = Task.Factory.StartNew((Func<object, Task>)doThing, 2, source.Token, TaskCreationOptions.AttachedToParent, pair.ExclusiveScheduler);
Task Task3 = doThing(3);
Task Task4 = Task.Factory.StartNew(async (i) =>
{
Console.WriteLine("in do thing {0}", (int)i);
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("out of do thing {0}", (int)i);
}, 4, source.Token, TaskCreationOptions.None, pair.ExclusiveScheduler);
Task.WaitAll(Task1, Task2, Task3, Task4);
Console.ReadKey();
return;
}
你的意思是'Task2'应该在Task1完成后才能启动? – svick 2013-03-01 22:01:56
是的。我知道'.ContinueWith',但我不关心它们执行的顺序,只要它们不同时执行。 – Jake 2013-03-01 22:19:47
你的“非lambda”任务有什么意义?在你上面的例子中,虽然你不使用lambda,但是你在任务中使用委托,这是唯一重要的事情。 Lambdas只是语法糖。 – 2013-03-03 17:15:00