我想在两个操作之间放一个延迟,让其他任务(在两个操作之间)发生在此延迟期间,但代码将等到延迟结束以处理第二个操作。
例如:
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.就像我将在我的2种方法之间有精确的延迟。我怎么能这样做?!
答案 0 :(得分:4)
恰当命名的Task.Delay
用于在任务之间插入延迟。如您所知,您需要异步等待以便线程可以继续工作,因此请记住await
延迟任务。
请注意,延迟精度不是很高。 Windows不是实时操作系统,正如另一个答案正确指出的那样。
答案 1 :(得分:2)
您可以通过添加以下内容Asynchronous按顺序或按特定顺序启动您的操作:
void QObject::init(PrepareData prepareData)
{
threadPool->enqueue(&loadStuff, this, std::move(prepareData));
}
然后:
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
}
答案 2 :(得分:1)
你永远不会以你想要的粒度获得precisse延迟(你正在考虑一些事情,比如检查条件的时间,这可能只是纳秒,所以我假设你需要一个纳秒或微秒的精确度。) / p>
Windows不是RTOS,因此您无法确保在这些级别上为您的应用准确调整。
编辑:
根据你的说法,接近10毫秒的东西是可以接受的,这取决于你的计算机它可以是15毫秒,因为窗户的时间分辨率可以有这些变化。
您可以使用以下内容:
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());
}