2011-04-11 3 views
4

Чтение файла справки VS2008. Я понял, что чистый способ выхода из потока (в .net) - либо с помощью оператора return (на C#), либо с возможностью прохождения потока до конца метода.Что эквивалентно ExitThread (ExitCode) и GetExitCodeThread в C# и .net?

Однако я не нашел метода или свойства, которые позволили бы мне установить код выхода потока и способ его извлечения (как это делается с использованием Win32 API). Поэтому возникает вопрос: как мне это сделать с помощью C# и .net?

Благодарим за помощь,

John.

ответ

7

Причина, по которой базовые примитивы нитей Win32 не отображаются, заключается в предотвращении использования управляемого кода. Команда CLR всегда работает над тем, как оптимизировать использование потоков, и не включает никаких гарантий относительно сопоставления управляемых: неуправляемых потоков 1: 1 (например, «Примечание» на this MSDN page). Если вы действительно хотите это сделать, вам нужно будет настроить обертки P/Invoke, которые используют неуправляемый дескриптор потока из Win32 GetCurrentThread(), или самостоятельно подключиться к процессу сопоставления потоков с помощью настраиваемого хоста. Я бы тоже не рекомендовал, если вам абсолютно не нужно взаимодействовать с чем-то, что использует коды выхода потока и не управляется с помощью кода. Выясните другой способ контрабанды информации о состоянии вокруг, если вы можете все это сделать (или используйте Task Parallel Library для абстрагирования уровня от голых потоков).

+0

nitzmahone, спасибо за ответ и ссылки. Учитывая, что между управляемыми потоками и потоками O/S не существует соответствия 1: 1, я думаю, что Pinvoking ExitThread и GetExitCodeThread не будут надежным решением. Я рассматриваю вывод нового класса потоков из Thread, который добавляет код выхода вместе с соответствующими методами для его установки и получения. Я обеспокоен тем, что, поскольку извлечение кода выхода произойдет после завершения потока, GC может удалить объект потока до того, как будет извлечен код выхода. Есть ли способ гарантировать, что этого не произойдет? – Hex440bx

+0

Я сомневаюсь, что там вы получите хорошие результаты. Нить запечатана и не без оснований. Если вы планируете создать что-то, что не использует механизм кода выхода Win32, почему бы не использовать одну из конструкций более высокого уровня, которые уже существуют для отслеживания состояния логического потока (вышеупомянутый TPL и т. Д.)? В качестве альтернативы вы можете сделать что-то столь же простое, как статический словарь управляемых идентификаторов потоков и «коды выхода» - гарантированно проживать столько, сколько захотите. Не знаю всех деталей вашего проекта, но похоже, что вы пытаетесь сделать жизнь сложнее, чем нужно ... – nitzmahone

+0

Реальная проблема в том, что я просто изучаю .net и C#. Я очень хорошо разбираюсь в обычном Windows API, поэтому я пытаюсь сопоставить то, что я знаю об использовании WinAPI, чтобы сделать то же самое в .net и C#. Очевидно, что этот метод имеет свои «проблемы», но он, как правило, хорош. В этом случае это звучит так, как будто я просто должен узнать больше, чтобы понять, как делать вещи .net. Благодарим вас за помощь и предложения. Джон. – Hex440bx