給定以下代碼,是否可以爲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