[英]How to put a delay between 2 tasks?
我想在两个动作之间放置一个延迟,让其他任务(在两个动作之间)在此延迟期间发生,但是代码将等待,直到延迟结束以处理第二个动作。
例如这样:
Stopwatch sw = new Stopwatch();
public void
{
If (checkbox1.checked)
{
random1.class1(); //action 1
random2.class2(); //action 2
sw.start();
}
If (checkbox2.checked)
{
Random2.class1(); //action 3
Random2.class2(); //action 4
sw.stop();
}
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
}
条件可能需要花费时间进行检查(尽管不能忽略)
我希望动作2和动作4之间可以有最精确的延迟。 我尝试使用System.Threading.Thread.Sleep(10);
但是它会使代码停止10毫秒,但要花一些时间检查条件,甚至需要更多时间才能执行操作3。 我用stopwatch
检查了一下,而动作2和动作4之间的延迟波动太大。
我想在动作2和动作4之间设置一个延迟,例如100ms,代码将首先检查条件,然后执行动作3,并等待直到我的延迟结束,并且一旦延迟结束,它就会执行动作4。我的两种方法之间的精确延迟。 我该怎么办?
恰当命名的Task.Delay
用于在任务之间插入延迟。 如您所述,您需要异步等待,以便线程可以继续工作,因此请记住await
延迟任务。
注意延迟不是很高的精度。 Windows不是一个实时操作系统,正如其他答案正确指出的那样。
您可以通过添加以下内容来异步操作以按顺序或按特定顺序启动:
using System.Threading.Tasks;
接着:
Task Action1()
{
// do stuff
return Task.FromResult(true)
}
Task Action2()
{
// do more stuff
return Task.FromResult(true)
}
async void DoInOrder()
{
await Action1(); // waits for Action1 to finish
await Action2(); // waits for Action2 to finish
}
或者,也可以将其用于延迟两者的实际目的(如果它们直接相关),如下所示:
Task<int> GetMyInt()
{
int value = 3;
return Task.FromResult(value);
}
async void DoWithMyInt()
{
int SomeInt = await GetMyInt(); // will wait for GetMyInt()
// to return then assign value
// to SomeInt and then continue
}
您永远不会以您想要的粒度获得精确的延迟(您需要花费一些时间来检查条件,例如大概只有几纳秒的时间,所以我假设您需要一个十亿分之一秒或毫秒的精度。
Windows不是RTOS,因此您不能在这些级别上确保您的应用程序的准确时机。
编辑:
根据您所说的,大约10ms的时间是可以接受的,因为您的计算机可能是15ms,因为窗口的时间分辨率可能会有这些变化。
您可以使用如下形式:
Stopwatch sw = new Stopwatch();
public void
{
If (checkbox1.checked)
{
random1.class1(); //action 1
random2.class2(); //action 2
sw.start();
}
If (checkbox2.checked)
{
Random2.class1(); //action 3
var timeToSleep = (int)Math.Max(100 - sw.ElapsedMilliseconds, 0);
Thread.Sleep(timeToSleep);
sw.stop(); //You stop the watch here, you're measuring the time from task2 to task4, not the time which action 4 takes to execute
Random2.class2(); //action 4
}
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.