Вызывается ли BackgroundWorker OnDoWork из вызывающего потока или рабочего потока?

Я унаследовал a BackgroundWorker и переопределил OnDoWork:

protected override void OnDoWork(DoWorkEventArgs e)
{
 WorkerEndedEvent.Reset();
 base.OnDoWork(e);
}

Мой вопрос в том, из какого потока это будет вызвано? Гарантируется ли это во время моего вызова на RunWorkerAsync() или он может быть вызван впоследствии (т.е. Из рабочего потока)?

1 ответ

Он будет вызван рабочим потоком и не будет вызван во время вызова RunWorkerAsync.

В документации для RunWorkerAsync указано:

Метод RunWorkerAsync отправляет запрос на запуск операции выполняется асинхронно. Когда запрос обслуживается, событие DoWork, который, в свою очередь, начинает выполнение вашего фона операции.

Итак, RunWorkerAsync отправляет запрос на запуск операции, что приведет к событию DoWork. Он не дает никаких гарантий относительно того, когда будет вызываться DoWork.

Он также документирован, поскольку использует отдельный поток для его работы:

Выполняет операцию в отдельном потоке.

Таким образом, DoWork явно вызывается в другом потоке, чем вызывается RunWorkerAsync.

licensed under cc by-sa 3.0 with attribution.