Случается, когда вы пытаетесь использовать переменную, которая ранее не была определена.
Типичным примером может быть
foreach ($items as $item) {
// do something with item
$counter++;
}
Если вы ранее не определяли $counter
, код, указанный выше, вызывает уведомление.
Правильный способ - установить переменную перед ее использованием, даже если это просто пустая строка, например
$counter = 0;
foreach ($items as $item) {
// do something with item
$counter++;
}
Вопросы, относящиеся:
Это - лучшее учебное руководство когда-либо для Потока (для C#): http://www.albahari.com/threading/
Для ожидания необходимо использовать.Join () на потоке. Это будет ожидать, пока конец шага не является заданием. Другие мудрые, которые необходимо будет использовать , Ожидают/Пульсируют .
Хорошие альтернативы вся работа потоком, достигающим точки, где радо ожидать. Приостановите было опасно, потому что это могло приостановить поток, в то время как это содержало блокировку на взаимном исключении - рецепт для мертвых блокировок.
Поэтому то, в чем нуждается Ваш поток, является ManualResetEvent, что он может Ожидать на - в то время, когда для него безопасно сделать так, когда он не содержит блокировок.
Тот является слишком длинным. То, в чем я нуждаюсь, является быстрыми примерами кода для использования. Я нашел один из обсуждения и ответил Mark R. Dawson в http://bytes.com/groups/net-c/458947-thread-suspend . Это объясняет опасность устаревших методов и как использовать AutoResetEvent для уведомления второго потока, чтобы продолжить обрабатывать.
Я соглашаюсь, что это - большое учебное руководство. Главная причина Приостанавливает (), и Резюме () являются устаревшими, то, потому что они - довольно опасные методы. В любом Потоке точки t мог делать что-либо. Что-либо. Предположите, что Ваш поток читает файл и имеет блокировку на нем. Вы приостанавливаете свой поток. Файл остается заблокированным. То же идет для любых других ресурсов. То же идет для блокировки на взаимном исключении.
Вы захотите использовать 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 позволяет «возобновить» только один поток.
Решение: Имейте поток, только возобновляют другой поток, если другой поток приостановил себя. Таким образом первый поток только возобновляет другой поток, если другой поток приостановил себя (т.е. его ThreadState = Приостановленный), и, таким образом, сделал себя готовым быть возобновленным. Это кажется безопасным & безупречный.
Или, разве я не понимаю поточную обработку .NET?