给出任务列表,如何检查所有这些任务当前正在等待还是正在忙于计算?
通过“等待”,我的意思是该任务将不会继续,直到发生其他变化:任务卡在await otherTask
或await semaphore.AsyncWaitHandle()
等上。
这是针对discrete event simulation的。
下面是我要执行的操作的一个示例:我想模拟一些共享资源并需要一些时间才能完成的作业(t1,t2,t3)。
因此t1和t2共享资源,并且不能同时运行。 t3要求t1完整。
在现实世界中,这些任务将花费数小时,我可以使用Task.Delay()对此进行简单模拟,但是我不想等待那么长时间。
因此,每当所有任务被阻止时,我都想快速转发时间。
因此,如果所有任务都被阻止,我需要Task.Delay()以外的其他东西来释放任务。
public static async Task MainAsync()
{
Task t1 = Screw1(), t2=Screw2(), t3 = ThightenBolts1(t1);
await Task.WhenAll(t1,t2,t3); // this takes 6 hours :(
}
// There is only one screwdriver for everyone
static SemaphoreSlim screwdriver = new SemaphoreSlim(1,1);
static async Task Screw1()
{
await screwdriver.WaitAsync();
await Task.Delay(TimeSpan.FromHours(1));
Console.WriteLine("Item 1 screwed.");
screwdriver.Release();
}
static async Task Screw2()
{
await screwdriver.WaitAsync();
await Task.Delay(TimeSpan.FromHours(2));
Console.WriteLine("Item 2 screwed.");
screwdriver.Release();
}
static async Task ThightenBolts1(Task prevTask)
{
await prevTask;
await Task.Delay(TimeSpan.FromHours(3));
Console.WriteLine("Item 1 thightened.");
}
此模拟将需要6个小时才能完成。大多数情况下,所有任务都被阻止,等待模拟时间过去。
所以我想快进,但前提是当前没有任何任务正在运行某些计算。
为此,我需要检测到所有任务都在等待某件事,而不是忙于计算。然后,我可以实现一个Task.Delay()版本,该版本可以较早地继续下一个任务。
答案 0 :(得分:-2)
您可以使用await等待任务完成,然后再开始下一个任务。
public async void starttasks()
{
await Task.Run(() => { /* your code */ } ); //Task1
await Task.Run(() => { /* your code */ } ); //Task2
await Task.Run(() => { /* your code */ } ); //Task3
await Task.Run(() => { /* your code */ } ); //Task4
await Task.Run(() => { /* your code */ } ); //Task5
}
这将执行第一个任务,并等待其完成以分别执行下一个任务。 希望对您有帮助。
您还可以在上面提供的代码后添加task.delay,以等待所有任务完成。
await Task.Delay(5000);