супер простой вопрос, но я просто хотел уточнить.Я хочу иметь возможность перезапустить поток с помощью AutoResetEvent, поэтому я вызываю следующую последовательность методов для моего AutoResetEvent.
setupEvent.Reset();
setupEvent.Set();
Я знаю, что это действительно очевидно, но MSDN в своей документации не заявляет, чтоМетод Reset перезапускает поток, просто он устанавливает состояние события как не сигнализированное.
ОБНОВЛЕНИЕ:
Да, другой поток ожидает в WaitOne (), я предполагаю, когдаон вызывается, он возобновляется в том месте, где остановился, чего я не хочу, я хочу, чтобы он перезапустился с самого начала.Следующий пример из этого ценного ресурса иллюстрирует это:
static void Main()
{
new Thread (Work).Start();
_ready.WaitOne(); // First wait until worker is ready
lock (_locker) _message = "ooo";
_go.Set(); // Tell worker to go
_ready.WaitOne();
lock (_locker) _message = "ahhh"; // Give the worker another message
_go.Set();
_ready.WaitOne();
lock (_locker) _message = null; // Signal the worker to exit
_go.Set();
}
static void Work()
{
while (true)
{
_ready.Set(); // Indicate that we're ready
_go.WaitOne(); // Wait to be kicked off...
lock (_locker)
{
if (_message == null) return; // Gracefully exit
Console.WriteLine (_message);
}
}
}
Если я правильно понимаю этот пример, обратите внимание, как основной поток возобновит работу с того места, где он остановился, когда рабочий поток сигнализирует об этом,но в моем случае я бы хотел, чтобы основной поток перезапускался с самого начала.
ОБНОВЛЕНИЕ 2:
@ Ярослав Джандек - Это довольно сложный процесс, но в основном у меня есть поток CopyDetection, который выполняетFileSystemWatcher для мониторинга папки на наличие новых файлов, которые перемещаются или копируются в нее.Мой второй поток отвечает за репликацию структуры этой конкретной папки в другую папку.Таким образом, мой поток CopyDetection должен блокировать работу этого потока во время выполнения операции копирования / перемещения.Когда операция завершается, поток CopyDetection перезапускает второй поток, чтобы он мог повторно продублировать структуру папок с вновь добавленными файлами.
ОБНОВЛЕНИЕ 3:
@ SwDevMan81 - на самом деле я этого не сделалподумайте об этом, и это сработает, если не считать одного предупреждения.В моей программе исходная папка, которая дублируется, очищается после завершения процесса дублирования.Вот почему мне нужно заблокировать и перезапустить второй поток при добавлении новых элементов в исходную папку, чтобы у него была возможность правильно проанализировать новую структуру папки.
Чтобы решить эту проблему, яподумав, может быть, добавив флаг, который сигнализирует о том, что можно безопасно удалить содержимое исходной папки.Полагаю, я мог бы поместить операцию удаления в свой собственный поток очистки.
@ Jaroslav Jandek - Мои извинения, я думал, что было бы просто перезапустить поток по своей прихоти.Чтобы ответить на ваши вопросы, я не удаляю исходную папку, только ее содержимое, это требование моего работодателя, которое, к сожалению, я не могу изменить.Файлы в исходной папке перемещаются, но не все, только файлы, которые были надлежащим образом проверены другим процессом, остальные должны быть очищены, т.е. исходная папка очищена.Кроме того, причина репликации структуры исходных папок заключается в том, что некоторые файлы содержатся в очень строгой иерархии подпапок, которая должна сохраняться в целевом каталоге.Снова извините за усложнение.Все эти механизмы внедрены, были протестированы и работают, поэтому я не чувствовал необходимости подробно останавливаться на них.Мне нужно только определять, когда добавляются новые файлы, чтобы я мог надлежащим образом остановить другие процессы во время выполнения операции копирования / перемещения, а затем безопасно сменить структуру исходной папки и возобновить обработку.