休眠于方法中,而不是整个C#中的程序

时间:2018-11-11 17:26:06

标签: c#

我想知道如何在不使用Thread.sleep(time)的情况下使方法等待,请看以下示例:

    public askRessource(systemRessource ressource, int time)
    {
        acquireRessource(ressource, time);

        Thread.Sleep(time * 1000);

        freeRessource(ressource);
    }

这是我使用Thread.sleep的代码,这是我的主类:

static void Main(string[] args)
    {

        systemRessource disk1 = new systemRessource("disk1");

        askRessource ask1 = new askRessource(disk1, 3);

        systemRessource ram1 = new systemRessource("ram1");

        ask1 = new askRessource(ram1, 7);

        systemRessource ram2 = new systemRessource("ram2");

        ask1 = new askRessource(disk1, 3);

        systemRessource disk3 = new systemRessource("disk3");

        askRessource ask2 = new askRessource(disk3, 6);


        Console.ReadKey();

    }

但是现在看看输出会发生什么:

Output

它将以ask1 askRessource(disk1,3)开头,因此它将执行ask1.acquireRessource,然后它将休眠3秒钟,然后再休眠ask1.freeRessource,然后继续使用ask1 askRessource(ram1,7),依此类推,但是问题是我希望我的程序执行该输出:

  

ask1.acquireRessource(disk1、3);   ask1.acquireRessource(ram1,7);   ask2.acquireRessource(disk3,6);   都在同一时间,然后在3秒后:   ask1.freeRessource(disk1);   6秒后:ask2.freeRessource(disk3);   并在7秒后:ask1.freeRessource(ram1);

所以我认为我需要使用Thread.Sleep以外的其他东西。

3 个答案:

答案 0 :(得分:1)

可能您可以使用

await Task.Delay(3000);

答案 1 :(得分:0)

您可以为每个systemRessource使用backgroundworker。这使您可以使用单独的线程,也可以独立睡眠。

答案 2 :(得分:0)

好像您得到Classic Race Condition。确保我需要查看acquireRessourcefreeRessource。我想这是异步功能,有时是在前一个功能完成之前开始的功能。 解决问题的提示:

  1. 准备好任务和异步/等待模式。
  2. 了解有关线程同步的信息:lockMonitorSemaphore