Готовые и завершенные события - PullRequest
0 голосов
/ 30 января 2011

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

Я обнаружил, что класс 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. │
└───────────┴────────────────────────┴─────────────────────────────────────────────────────────────────────────┘

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

Ответы [ 2 ]

2 голосов
/ 30 января 2011

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

Модель событий не предусматривает этого, потому что вы можете легко вызвать метод

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

Так что не было явного случая для такого события.

1 голос
/ 30 января 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...