检查任务正在等待还是忙

时间:2018-07-27 12:07:59

标签: c# synchronization task simulation blocking

给出任务列表,如何检查所有这些任务当前正在等待还是正在忙于计算?

通过“等待”,我的意思是该任务将不会继续,直到发生其他变化:任务卡在await otherTaskawait 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()版本,该版本可以较早地继续下一个任务。

1 个答案:

答案 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);