2017-02-07 10 views
0

Есть ли способ установить код выхода потока вручную на C# (для целей отладки)?Установить код выхода потока вручную в C#?

Выбранный ответ на соответствующий вопрос «What is a thread exit code?» гласит:

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

Есть ли действительно способ установить код выхода нити самостоятельно?

+0

Вы не должны использовать/полагаться на них в .net, причины/пояснения [здесь] (https://stackoverflow.com/questions/5628908/whats-the-equivalent-of-exitthreadexitcode-and-getexitcodethread-in -c-диез). –

+0

Существует вызов Windows API ['ExitThread (DWORD)'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682659 (v = vs.85) .aspx), который выходит из с помощью предоставленного кода выхода. Но я уверен, что это очень плохая идея назвать это из управляемых потоков по причинам, связанным с Manfred –

ответ

3

В потоках .NET нет кодов выхода. Они используются родными потоками в Windows, но собственные потоки только используют управляемыми потоками и не имеют соответствия 1: 1 данному управляемому потоку. Тот же управляемый поток может работать на нескольких собственных потоках и наоборот (хотя, очевидно, не в одно и то же время). Процитировать MSDN:

Операционная система ThreadId не имеет фиксированного отношения к управляемому потоку, поскольку неуправляемый хост может контролировать взаимосвязь между управляемыми и неуправляемыми потоками. В частности, сложный хост может использовать Fiber API для планирования многих управляемых потоков в одном потоке операционной системы или для перемещения управляемого потока между различными потоками операционной системы.

Это, конечно, относится ко всем ресурсам, привязанных к родной теме - но среда выполнение делает управление управляемых ресурсов нити, конечно; и для неуправляемого вызова кода в управляемый код поток будет сохраняться одинаковым, иначе взаимодействие будет совершенно невозможным.

Если вы хотите добавить дополнительную информацию в задачи, попробуйте использовать более высокий уровень абстракции - например, Task. Нужно ли выводить статус задачи по завершении? Добавьте продолжение. Нужно проверить статус задания, на которое у вас есть ссылка? Подождите или запросите объект Task.

+0

«Тот же управляемый поток может работать на нескольких собственных потоках», как это так? –

+0

@MathuSumMut Почему бы и нет? Он никак не связан с родными нитями. Время выполнения определяет, какие собственные потоки обрабатывают управляемые потоки. – Luaan

+0

Почему управляемая нить не связывает 1: 1 с собственным потоком? Это делается для поддержания совместимости. Я знаю, что вы идете по тому, что технически * разрешено спецификацией, но нет никаких преимуществ, чтобы не отображать 1: 1, и действительно, чтобы не связать с реализацией, для этого есть отдельный пул потоков. –