0

这是我的CS

protected void timer_Tick(object sender, EventArgs e)
    {
        lblNum.Text = string.Format("{0:dd:MM:yyyy hh:mm:ss}", DateTime.Now);

        if (DateTime.Now.Second == 30)
        {
            Thread t = new Thread(DisplayImages);
            t.Start();
            //t.Suspend();
            t.Join();
        }
    }

我想等待线程 t 一段固定的时间间隔,让我的主线程保持不变。在那个间隔之后,我想在线程 t 中做一些事情。

我尝试了 t.Sleep(),但无济于事,因为 Sleep() 是静态的。

更新:

请参阅我现有的问题。这个问题是其中的一部分。我的主线程有一个我不想停止的代码。所以我不能使用 Thread.Sleep() 因为它可能会冻结主要的。

4

2 回答 2

5

编辑:鉴于这是 ASP.NET,您所尝试做的事情是否有意义并不清楚。您很可能实际上想要客户端(Javascript)延迟。你还没有真正告诉我们你想要达到什么效果,但我强烈怀疑,一旦你开始考虑请求/响应时间是什么样的,在显示图像之前等待 30 秒的想法真的没有'不能在服务器端工作……您要么延迟整个响应,要么在您尝试显示图像时发送它。将延迟放在客户端更有意义。

如果创建一个从睡眠开始的线程实际上是有意义的......

我想等待线程 t 一段固定的时间间隔,让我的主线程保持不变。在那个间隔之后,我想在线程 t 中做一些事情。

听起来您只想ThreadStart从另一个创建一个,它会休眠然后执行原始的:

public static ThreadStart CreateDelayedThreadStart(ThreadStart original,
                                                   TimeSpan delay)
{
    return () =>
    {
        Thread.Sleep(delay);
        original();
    };
}

然后:

Thread t = new Thread(CreateDelayedThreadStart(DisplayImages,
                                               TimeSpan.FromSeconds(30));
t.Start();

您不应该使用Thread.Join因为这会阻塞调用线程。

我不认为这真的是安排任务在 30 秒内开始的最佳方式,请注意。我建议您考虑使用 TPL ...

于 2013-05-28T12:33:03.763 回答
0

你可以使用方法Thread.Sleep。这可以在该线程执行的上下文中调用。

而且,注意到 ASP.NET 标记后,我倾向于同意 Jon 的观点(好像无论如何我都不会同意!)。在 ASP.NET 中,您想像这样使用多线程。而是考虑将逻辑提取到适当的介质中,例如 Windows 服务或任务。

您不想在 Web 应用程序本身中执行“长时间运行的任务”。

于 2013-05-28T12:29:52.580 回答