如何在两个任务之间延迟?

时间:2016-06-09 15:49:05

标签: c# .net

我想在两个操作之间放一个延迟,让其他任务(在两个操作之间)发生在此延迟期间,但代码将等到延迟结束以处理第二个操作。

例如:

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种方法之间有精确的延迟。我怎么能这样做?!

3 个答案:

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