2013-05-28 3 views
0

Вот мой CSПриостановка потока для фиксированного интервала в C#

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.Sleep(), но безрезультатно, поскольку Sleep() является статическим.

Update:

Смотрите мою существующую question. Этот вопрос является частью этого. В моей основной теме есть тикер, который я не хочу останавливать. Поэтому я не могу использовать Thread.Sleep(), поскольку он может заморозить основной.

+1

Почему бы не начать 'DisplayImages()' с 'Thread.Sleep (30000);'? –

+0

Хорошо, я понимаю, чего вы хотите. Что мешает вам это делать? – usr

+0

Зачем закрывать? Любая причина? –

ответ

0

Вы можете использовать метод Thread.Sleep. Это можно было бы вызвать в контексте выполнения этого потока.

И, заметив тег ASP.NET, я склонен согласиться с Джоном (как будто я не буду в любом случае!). В ASP.NET вы не хотите быть многопоточными, как это. Вместо этого рассмотрите извлечение логики в соответствующий носитель, например службу или задачу Windows.

You don't want to do 'long running tasks' in the web app itself.

+0

см. Мой обновленный вопрос –

+2

@AmitRanjan Я вижу, пожалуйста, не делайте этого. –

+0

Я знаю, но мой клиент сказал, что мне нужен такой. И нагрузка приложения меньше или равна 0. Вряд ли 1-2 пользователя в день. Поэтому он не заботится о производительности приложения. Поэтому мы слишком не заботимся о производительности приложения. –

5

EDIT: Учитывая, что это 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 ...

+0

Наконец-то привлекло внимание гуру. Я ждал. Я буду следовать тому, как вы показали мне. :) –

+0

И насколько это полезно в ASP.NET, на стороне сервера? Вы помогаете OP просверлить отверстие в ноге. –

+0

@HenkHolterman: отсюда последнее предложение. Я могу переместить это вверх, если вы предпочтете это ... –

Смежные вопросы