繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM