C#延迟一个帖子

时间:2011-08-02 14:20:55

标签: c# delay

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

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

如何暂停线程而不暂停整个程序?

3 个答案:

答案 0 :(得分:3)

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

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

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

        Thread t = new Thread(new ParameterizedThreadStart((obj) => {
            // Do Something with parameters
        }));
        Object obj = ...;
        t.Start(obj);

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

该程序将在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");
    }
}