Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# 延迟线程_C#_Delay - Fatal编程技术网

C# 延迟线程

C# 延迟线程,c#,delay,C#,Delay,我有三个线程:主线程和两个计时器。第一个计时器在一段时间后激活第二个计时器,然后自行禁用 我使用“Thread.Sleep(int)”来延迟第二个计时器的激活。但当“睡眠”功能工作时,整个程序暂停 如何在不暂停整个程序的情况下暂停线程?您可以使用任务并行库的延续式编程。计时器不会在新线程中执行代码。间隔之后,它们在Windows消息队列中引发一个事件,然后主线程执行该事件,因此thread.Sleep(int)暂停所有操作 要解决这个问题,您需要实际启动自己的线程。这是一个简单的过程:

我有三个线程:主线程和两个计时器。第一个计时器在一段时间后激活第二个计时器,然后自行禁用

我使用“Thread.Sleep(int)”来延迟第二个计时器的激活。但当“睡眠”功能工作时,整个程序暂停


如何在不暂停整个程序的情况下暂停线程?

您可以使用任务并行库的延续式编程。

计时器不会在新线程中执行代码。间隔之后,它们在Windows消息队列中引发一个事件,然后主线程执行该事件,因此
thread.Sleep(int)
暂停所有操作

要解决这个问题,您需要实际启动自己的线程。这是一个简单的过程:

        Thread t = new Thread(new ThreadStart(() => {
            // Do Something without parameters
        }));
        t.Start();


在启动线程之前,可能需要在线程上设置其他参数,这些参数将影响应用程序的其余部分,例如
IsBackground

此程序将在3秒后启动第一个计时器。启动第二个计时器后,第一个计时器将停止。此后,第二个计时器将每秒引发事件:

    class Program
{
    static void Main(string[] args)
    {
        Timer t1 = new Timer();
        t1.Elapsed += new ElapsedEventHandler(t1_Elapsed);
        t1.AutoReset = false;
        t1.Interval = 5000;
        t1.Start();

        while (true)
        { }
    }

    static void t1_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("t1 timer elapsed");
        Timer t2 = new Timer();
        t2.Elapsed += new ElapsedEventHandler(t2_Elapsed);
        t2.AutoReset = true;
        t2.Interval = 1000;
        t2.Start();
    }

    static void t2_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("t2 timer elapsed");
    }
}

给我们看一些代码。你是如何初始化计时器的?是的,给我们看一些代码。RTL中至少有三种计时器。你用的是哪一种?这完全取决于你使用的定时器类型
System.Windows.Forms.Timer
在UI线程上引发
appead
事件
System.Timers.Timer
在池线程或UI线程(如果提供了
SynchronizingObject
)上引发它
System.Threading.Timer
始终在线程池线程上执行其回调。感谢您的澄清。我忘了有这么多计时器,并假设
System.Windows.Forms.Timer
    class Program
{
    static void Main(string[] args)
    {
        Timer t1 = new Timer();
        t1.Elapsed += new ElapsedEventHandler(t1_Elapsed);
        t1.AutoReset = false;
        t1.Interval = 5000;
        t1.Start();

        while (true)
        { }
    }

    static void t1_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("t1 timer elapsed");
        Timer t2 = new Timer();
        t2.Elapsed += new ElapsedEventHandler(t2_Elapsed);
        t2.AutoReset = true;
        t2.Interval = 1000;
        t2.Start();
    }

    static void t2_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("t2 timer elapsed");
    }
}