.Net Как эффективно получать уведомления, когда поток приостановлен? - PullRequest
0 голосов
/ 02 декабря 2009

Кто-нибудь знает способ получить уведомление, когда определенный поток приостанавливается и возобновляется?

Я бы хотел иметь что-то вроде этого:

thread.Suspended += delegate
{
    //Do something
};

thread.Resumed += delegate
{
    //Do something else
};

Я сомневаюсь, что .Net Framework имеет такую ​​возможность, но есть ли способ достичь этого, возможно, с помощью pinvoke? Мне нужно, чтобы это было возможно при низких накладных расходах.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2009

Если вы посвятили себя написанию собственного пула потоков, это, вероятно, не поможет, но я бы попробовал придерживаться класса .NET ThreadPool и настроить его в соответствии с требованиями с помощью SetMaxThreads / SetMinThreads и GetMaxThreads / GetAvailableThreads. Есть ли какая-то конкретная причина, почему это недостаточно хорошо?

Я был в PDC в прошлом году и посетил некоторые из выступлений Джо Даффи по параллелизму, которые были довольно интересными. Я помню, что он говорил о предоставлении расширяемого класса пула потоков в .NET, поскольку MSFT, как правило, обнаруживают, что, когда люди идут и пишут свои собственные пулы потоков, они будут работать нормально большую часть времени, но их поймают в крайних случаях различные ошибки. Предоставляя механизм расширяемости, они надеялись ограничить вероятность того, что разработчики будут пойманы.

0 голосов
/ 02 декабря 2009

В Windows нет такого механизма уведомлений для Thread.Suspend / Thread.Resume Вам не следует использовать Thread.Suspend / Thread.Resume - это может легко привести к взаимоблокировкам и другим трудным для поиска ошибкам. Используйте обычные примитивы синхронизации (блокировки, события и т. Д.), Чтобы заставить поток блокироваться, пока он не выполнит свою работу.

UPDATE:

Вы можете включить события переключения контекста в ETW и использовать их через ProcessTrace . OldThreadId и OldThreadState сообщают, почему поток прекратил работу (переход в состояние готовности, ожидания, ожидания и т. Д. И т. Д.). NewThreadId сообщит вам, когда поток начнет работать. Вам придется обрабатывать события для каждого переключения контекста в системе. Это будет невероятно большой объем, потребляющий много процессорного времени в вашем процессе, и будет очень трудно получить точную информацию.

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