#c# #multithreading #exit #exit-code
#c# #многопоточность #выход #exit-code
Вопрос:
Читая файл справки VS2008, я выяснил, что чистый способ выхода из потока (в .net) — это либо использовать оператор return (в C #), либо позволить потоку достичь конца метода.
Однако я не нашел метода или свойства, которые позволили бы мне задать код выхода потока, ни способа его извлечения (как это делается с помощью Win32 API). Следовательно, вопрос в том, как мне это сделать, используя C # и .net?
Спасибо за вашу помощь,
Джон.
Ответ №1:
Причина, по которой базовые примитивы потоков Win32 не доступны, заключается в том, чтобы предотвратить использование управляемого кода от их использования. Команда CLR постоянно работает над способами оптимизации использования потоков, и это не включает никаких гарантий относительно сопоставления управляемых и неуправляемых потоков 1: 1 (см., например, «Примечание» на этой странице MSDN). Если вы действительно хотите это сделать в любом случае, вам нужно настроить оболочки P / Invoke, которые используют неуправляемый дескриптор потока из Win32 GetCurrentThread(), или подключиться к процессу сопоставления потоков самостоятельно с помощью пользовательского хоста. Я бы тоже не рекомендовал, если только вам абсолютно не нужно взаимодействовать с чем-то, что использует коды выхода из потока и не зависит от управляемого кода. Найдите другой способ переправлять информацию о состоянии, если вы можете сделать все это управляемым (или используйте библиотеку параллельных задач для абстрагирования уровня от простых потоков).
Комментарии:
1. ницмахоне, спасибо за ответ и ссылки. Учитывая, что между управляемыми потоками и потоками O / S нет соответствия 1: 1, я думаю, что привязка ExitThread и GetExitCodeThread не будет надежным решением. Я рассматриваю возможность получения нового класса thread из Thread, который добавляет код выхода вместе с соответствующими методами для его установки и извлечения. Меня беспокоит то, что, поскольку извлечение кода выхода произойдет после завершения потока, GC, возможно, удалил объект thread до извлечения кода выхода. Есть ли способ гарантировать, что этого не произойдет?
2. Я сомневаюсь, что вы получите хорошие результаты и там — поток запечатан, и на то есть веская причина. Если вы рассматриваете возможность создания чего-либо, что не использует механизм кода выхода Win32, почему бы не использовать одну из конструкций более высокого уровня, которые уже существуют для отслеживания состояния логического потока (вышеупомянутый TPL и т.д.)? В качестве альтернативы, вы могли бы сделать что-то столь же простое, как статический словарь идентификаторов управляемых потоков и «кодов выхода», который гарантированно будет работать столько, сколько вы хотите. Не знаю всех деталей вашего проекта, но звучит так, как будто вы пытаетесь усложнить жизнь, чем это должно быть…
3. Настоящая проблема в том, что я только изучаю .net и C #. Я очень хорошо разбираюсь в простом Windows API, в результате я пытаюсь сопоставить то, что я знаю об использовании WinAPI, с выполнением того же самого в .net и C #. Очевидно, что у этого метода есть свои «проблемы», но обычно он хорош. В этом случае, похоже, мне просто нужно узнать больше, чтобы понять, как делать вещи с помощью .net. Спасибо за вашу помощь и предложения. Джон.
4. Вы будете проклинать путь Win32, как только сделаете что-то реальное с TPL. Желаю удачи в вашем путешествии … 🙂
5. Я обязательно проверю TPL, как только закончу изучать основы. Спасибо 🙂