Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 暂停System.Timers.Timer';他的工作_C#_Multithreading_Performance_Task - Fatal编程技术网

C# 暂停System.Timers.Timer';他的工作

C# 暂停System.Timers.Timer';他的工作,c#,multithreading,performance,task,C#,Multithreading,Performance,Task,我已经开始讨论:在周期、任务、延迟或线程中,使用什么更好的方法暂停System.Timers.Timer的作业1秒?睡眠 以下是示例案例: timer.Elapsed += (sender, args) => { for (int i = 0; i < 15; i++) { Thread.Sleep(1000); if (Connection.IsAlive) return true; } }; timer.appeased+=(发送方,参数)=> {

我已经开始讨论:在周期、任务、延迟或线程中,使用什么更好的方法暂停System.Timers.Timer的作业1秒?睡眠

以下是示例案例:

timer.Elapsed += (sender, args) =>
{
  for (int i = 0; i < 15; i++)
  {
    Thread.Sleep(1000);
    if (Connection.IsAlive) return true;
  }
};
timer.appeased+=(发送方,参数)=>
{
对于(int i=0;i<15;i++)
{
睡眠(1000);
if(Connection.IsAlive)返回true;
}
};

请帮我说说理由:)

这取决于你的目标是什么

Thread.Sleep
将阻止正在使用的系统线程。默认情况下,System.Timers.Timer使用系统线程池,这意味着您不会阻塞主线程,并且
thread.Sleep
的使用可能会与程序的其余部分同时执行。如果希望使用(并因此阻止)特定线程,则需要与
thread.Sleep
配合使用该属性

Task.Delay
将在不阻塞当前线程的情况下提供逻辑延迟。这是最好的方法,除非您有理由阻止特定线程。请记住,要使用
任务,您需要使事件处理程序异步。延迟

 timer.Elapsed += async (sender, args) =>
    {
         for (int i = 0; i < 15; i++)
         {
            await Task.Delay(1000);
            ...
         }
    }
timer.appeased+=async(发送方,参数)=>
{
对于(int i=0;i<15;i++)
{
等待任务。延迟(1000);
...
}
}

当您尝试这两种方法时发生了什么?如果您正在利用异步等待,则使用等待任务。延迟您不必阻塞线程。如果这段代码同时会被击中,我会考虑它,否则我可能不会费心。你如何定义哪个是“更好”?“更好”是指正确的一个: