我想知道如何在不使用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();
}
但是现在看看输出会发生什么:
它将以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
以外的其他东西。
答案 0 :(得分:1)
可能您可以使用
await Task.Delay(3000);
答案 1 :(得分:0)
您可以为每个systemRessource使用backgroundworker。这使您可以使用单独的线程,也可以独立睡眠。
答案 2 :(得分:0)
好像您得到Classic Race Condition。确保我需要查看acquireRessource
和freeRessource
。我想这是异步功能,有时是在前一个功能完成之前开始的功能。
解决问题的提示:
lock
,Monitor
,Semaphore