C# 将延迟添加到Task.WaitAll

C# 将延迟添加到Task.WaitAll,c#,.net,C#,.net,我试图同时运行两个硬件设备,避免任何延迟。为了实现这一点,我在C#中使用了“tasks”,但是我仍然有一个延迟。我是否可以在一个任务之间设置一个延迟,使它比另一个任务慢5毫秒?这是我的密码: public void runtasks() { var task1 = Task.Run(() => Task1.switch(true); //Can I insert a delay here to make Task1 5ms slower

我试图同时运行两个硬件设备,避免任何延迟。为了实现这一点,我在C#中使用了“tasks”,但是我仍然有一个延迟。我是否可以在一个任务之间设置一个延迟,使它比另一个任务慢5毫秒?这是我的密码:

    public void runtasks()
    {
        var task1 = Task.Run(() => Task1.switch(true);
        //Can I insert a delay here to make Task1 5ms slower
        var task2 = Task.Run(() => Task2.switch(false);

        Task.WaitAll(task1, task2);
    }

    public void RunTasks(object sender, EventArgs e)
    {
    for (int i = 0, i < 1000; i++)
    {
        runtasks();
    }
public void runtasks()
{
var task1=Task.Run(()=>task1.switch(true);
//我可以在此处插入延迟以使Task1慢5毫秒吗
var task2=Task.Run(()=>task2.switch(false);
Task.WaitAll(task1、task2);
}
公共void运行任务(对象发送方、事件参数)
{
对于(int i=0,i<1000;i++)
{
runtasks();
}

您可以使用System.Timers中的Timer类执行一次性延迟操作。我不知道这是否正是您想要的,但下面是代码(为了简单起见,我更改了一些部分):


.NET是一个错误的环境,不适合这种情况。最好是原生环境。不幸的是,我需要一个GUI,用户才能访问这些任务。您当然可以在代码中插入延迟。但是,这样做几乎总是错误的。此外,还不清楚您是否希望在对
Task.Run()的两次调用之间只需要一次延迟
,或者您希望第二个任务实际执行得更慢(例如,每次调用
runtasks()
)之间需要额外5毫秒)。此外,在非实时操作系统(如Windows)上调度5毫秒的延迟不太可能非常有效,因为线程调度不那么精确。最大的问题是不清楚“延迟”是什么您正在尝试解决此问题,也不知道为什么您认为可以通过增加更多延迟来解决此问题。所谓较慢,您的意思是Task2在启动前应等待5毫秒?不确定我是否理解此行为。但Task的延迟机制是Task.delay`Task.delay(5)。ContinueWith(t=>Task1.switch());计时器的分辨率约为20毫秒。我正在查看文档,但我没有发现任何关于20毫秒分辨率的信息。事实上,在这个官方文档页面中有一些使用5毫秒作为计时器的示例:您能给我一些源代码,以便我阅读吗?在.NET中,不同的计时器在prec方面有不同的特点ision/resolution。但是,所有计时器都涉及线程回调,Windows线程调度程序的粒度大约为50毫秒。事实上,在负载较重的系统中,计时器回调可能会延迟数百毫秒,这是因为处理回调的线程没有机会立即运行。在任何情况下,a)这个问题甚至不清楚,无法知道他们想要什么;b)即使你猜到了他们想要什么,也无法从任何.NET计时器对象中获得5毫秒的精度
class Program
{
    Task task1 = null;
    Task task2 = null;
    static void Main(string[] args)
    {
        Program newProgram = new Program();
        newProgram.runtasks();
        Console.ReadKey();
    }
    public  void runTheSecondOne(object source, EventArgs e)
    {
        Console.WriteLine("::runTheSecondOne::");
        task2 = Task.Run(() => Method2());

        Task.WaitAll(task1, task2);
    }
    public void Method1()
    {
        Console.WriteLine("::Method1::");
    }

    public void Method2()
    {
        Console.WriteLine("::Method2::");
    }
    public void runtasks()
    {
        task1 = Task.Run(() => Method1());
        //Can I insert a delay here to make Task1 5ms slower
        Timer actionDelayer= new Timer();
        actionDelayer.AutoReset = false;
        actionDelayer.Interval = 5;
        actionDelayer.Elapsed += new ElapsedEventHandler(runTheSecondOne);
        actionDelayer.Enabled = true;
    }
}