2011-01-30 2 views
0

У меня есть часть кода, которая должна быть выполнена в каждом потоке (независимо от того, как она порождена) работает в определенном домене приложения непосредственно перед тем, как поток начинает выполнять код и после завершения выполнения.Готовые и завершенные события

Я обнаружил, что класс System.ComponentModel.BackgroundWorker имеет то же самое, что и второе, что мне нужно (см. Таблицу).

 
┌───────────┬────────────────────────┬─────────────────────────────────────────────────────────────────────────┐ 
│ ? class │ BackgroundWorker class │ Description                │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ Ready  │ -      │ Operation execution is about to start.         │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ ?   │ DoWork     │ Execute operation.              │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ ?   │ ProgressChanged  │ Notify about progress in execution of operation.      │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ Completed │ RunWorkerCompleted  │ Operation has completed, has been cancelled or has raised an exception. │ 
└───────────┴────────────────────────┴─────────────────────────────────────────────────────────────────────────┘ 

Существуют такие события, как Ready и Завершена из предыдущей таблицы? Я не видел таких событий ни на System.Threading.Thread, ни System.AppDomain класс.

ответ

1

Существует множество способов начать новые темы. Пул потоков используется не только QueueUserWorkItem и BackgroundWorker, но и любым кодом, который выполняет асинхронные вызовы делегатов. Кроме того, методы Begin... и End... для асинхронных операций, таких как Stream.BeginRead и Stream.EndRead начальные и конечные потоки. И, конечно же, при использовании управляемых потоков есть стандарт Thread.Start(). А затем есть параллельная библиотека задач. , ,

И, конечно же, есть много способов начать потоки напрямую с помощью Windows API.

Даже если вы игнорируете возможности Windows API, вы по-прежнему просите подключить несколько различных механизмов, чтобы вы могли контролировать активность. Вам нужно будет задействовать функции управляемого потока, а также функции пула потоков, которые инициируют и закрывают рабочие элементы.

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

И если вы хотите включить возможности Windows API ... ну, удачи.

+0

К сожалению, вы, вероятно, правы. Большое спасибо за предоставленную информацию. –

2

Если я правильно понял, вам нужно событие в/до начала DoWork.

Событие-модель не ptovide это потому, что вы можете легко вызвать метод

  • непосредственно перед RunWorkerAsync, от вызывающего потока
  • сразу в начале DoWork из рабочего потока.

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

+0

Мне нужно выполнить часть кода до и после выполнения кода любым потоком. Решение, которое вы предлагаете, не является полным, потому что поток может быть создан после вызова Thread.Start для произвольного вызова делегата и ThreadPool для выполнения метода, поставленного в очередь для выполнения через вызов метода QueueUserWorkItem. –

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