我在玩任務我想推遲我的任務執行。推遲執行任務
我有一個樣品的方法是這樣的:
private async Task<bool> DoSomething(string name, int delayInSeconds)
{
Debug.WriteLine($"Inside task named: {name}");
await Task.Delay(TimeSpan.FromSeconds(delayInSeconds));
Debug.WriteLine($"Finishing task named: {name}");
return true;
}
我想先創建一些任務,然後執行一些工作,在這之後運行這些任務。由於線路Task<bool> myTask = DoSomething("Name", 4);
大火馬上任務,我已經想通是這樣的:
string[] taskNames = new string[2];
Task<Task<bool>>[] myTasks = new Task<Task<bool>>[2];
myTasks[0] = new Task<Task<bool>>(async() => await DoSomething(taskNames[0], taskNames[0].Length));
myTasks[1] = new Task<Task<bool>>(async() => await DoSomething(taskNames[1], taskNames[1].Length));
// I think I can declare it also like this, but this will create tasks later
//IEnumerable<Task<Task<bool>>> myTasks = taskNames.Select(x => new Task<Task<bool>>(async() => await DoSomething(x, x.Length)));
taskNames[0] = "First";
taskNames[1] = "Second";
Debug.WriteLine($"Tasks created");
var results = await Task.WhenAll(myTasks.Select(x => { x.Start(); return x.Unwrap(); }));
Debug.WriteLine($"Finishing: {results.Select(x => x.ToString()).Aggregate((a,b) => a + "," + b) }");
可以這樣做不同的方式,沒有包裝任務?
不錯 - 我沒想過用* Func *來創建任務,什麼都不需要進一步解開。事實證明,與所有這些樣本一起玩,你的解決方案有很大的不同 - 所有的任務運行在同一個UI線程上,它們運行良好,因爲它們是異步的。 – Romasz
沒錯,那就是我的「警告」部分所提到的。如果你想盡快把事情推送到線程池,你可以讓你的Func返回'Task.Run(()=> DoSomething(...))',而不必拆開結果 - 選擇仍然存在儘管我必須承認,它會導致一些相當粗俗的語法)。 –