Что альтернативные пути состоят в том, чтобы приостановить и возобновить поток?

Примечание: Неопределенная переменная

Случается, когда вы пытаетесь использовать переменную, которая ранее не была определена.

Типичным примером может быть

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Если вы ранее не определяли $counter, код, указанный выше, вызывает уведомление.

Правильный способ - установить переменную перед ее использованием, даже если это просто пустая строка, например

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Вопросы, относящиеся:

25
задан Pierre Arnaud 17 April 2013 в 07:34
поделиться

6 ответов

Это - лучшее учебное руководство когда-либо для Потока (для C#): http://www.albahari.com/threading/

Для ожидания необходимо использовать.Join () на потоке. Это будет ожидать, пока конец шага не является заданием. Другие мудрые, которые необходимо будет использовать , Ожидают/Пульсируют .

4
ответ дан Patrick Desjardins 28 November 2019 в 21:19
поделиться

Хорошие альтернативы вся работа потоком, достигающим точки, где радо ожидать. Приостановите было опасно, потому что это могло приостановить поток, в то время как это содержало блокировку на взаимном исключении - рецепт для мертвых блокировок.

Поэтому то, в чем нуждается Ваш поток, является ManualResetEvent, что он может Ожидать на - в то время, когда для него безопасно сделать так, когда он не содержит блокировок.

11
ответ дан Daniel Earwicker 28 November 2019 в 21:19
поделиться

Тот является слишком длинным. То, в чем я нуждаюсь, является быстрыми примерами кода для использования. Я нашел один из обсуждения и ответил Mark R. Dawson в http://bytes.com/groups/net-c/458947-thread-suspend . Это объясняет опасность устаревших методов и как использовать AutoResetEvent для уведомления второго потока, чтобы продолжить обрабатывать.

1
ответ дан David.Chu.ca 28 November 2019 в 21:19
поделиться

Я соглашаюсь, что это - большое учебное руководство. Главная причина Приостанавливает (), и Резюме () являются устаревшими, то, потому что они - довольно опасные методы. В любом Потоке точки t мог делать что-либо. Что-либо. Предположите, что Ваш поток читает файл и имеет блокировку на нем. Вы приостанавливаете свой поток. Файл остается заблокированным. То же идет для любых других ресурсов. То же идет для блокировки на взаимном исключении.

0
ответ дан Szymon Rozga 28 November 2019 в 21:19
поделиться

Вы захотите использовать AutoResetEvent EventWaitHandle.

Скажем, вы хотите сделать что-то подобное ( ПРИМЕЧАНИЕ : не делайте этого!):

private Thread myThread;

private void WorkerThread() 
{
    myThread = Thread.CurrentThread;
    while (true)
    {
        myThread.Suspend();
        //Do work.
    }
}

public void StartWorking() 
{
    myThread.Resume();
}

Как уже говорили другие, это плохая идея. Несмотря на то, что использование Suspend только для собственного потока является относительно безопасным, вы никогда не сможете понять, вызываете ли вы Resume, когда поток фактически приостановлен. Так что Suspend и Resume были устаревшими.

Вместо этого вы хотите использовать AutoResetEvent:

private EventWaitHandle wh = new AutoResetEvent();

private void WorkerThread() 
{
    while(true) 
    {
        wh.WaitOne();
        //Do work.
    }
}

public void StartWorking()
{
    wh.Set();
}

Рабочий поток будет ждать на дескрипторе ожидания, пока другой поток не вызовет StartWorking. Он работает так же, как и Suspend / Resume, так как AutoResetEvent позволяет «возобновить» только один поток.

20
ответ дан 28 November 2019 в 21:19
поделиться

Решение: Имейте поток, только возобновляют другой поток, если другой поток приостановил себя. Таким образом первый поток только возобновляет другой поток, если другой поток приостановил себя (т.е. его ThreadState = Приостановленный), и, таким образом, сделал себя готовым быть возобновленным. Это кажется безопасным & безупречный.

Или, разве я не понимаю поточную обработку .NET?

0
ответ дан 28 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: