2017-02-07 5 views
0

Gibt es eine Möglichkeit, den Thread-Exit-Code manuell in C# (für Debugging-Zwecke) festzulegen?Thread-Exitcode manuell in C# setzen?

Die gewählte Antwort einer verwandten Frage „What is a thread exit code?“ heißt es:

0, dass es sicher, während alles andere als erwartet tat nicht Ausfahrt zu bedeuten neigt verlassen zu bedeuten neigt. Aber dann kann dieser Exit-Code von Ihnen selbst in Code gesetzt werden, um dies komplett zu übersehen.

Gibt es wirklich eine Möglichkeit, einen Thread des Exit-Code selbst zu setzen?

+0

Sie sollten nicht verwenden/verlassen sich auf sie in .net, Gründe/Erklärung [hier] (https://stackoverflow.com/questions/5628908/whats-the-äquivalent-of-exitthreadexitcode-and-getexitcodethread-in -c-scharf). –

+0

Es gibt einen Windows-API-Aufruf ['ExitThread (DWORD)'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682659 (v = vs.85) .aspx), der eine Thread mit dem bereitgestellten Exit-Code. Aber ich bin mir ziemlich sicher, dass es eine sehr schlechte Idee ist, das aus verwalteten Threads aufzurufen, aus den Gründen, die von Manfred –

Antwort

3

.NET-Threads haben keine Exit-Codes. Diese werden von den nativen Threads unter Windows verwendet, aber native Threads werden nur von verwalteten Threads verwendet und haben keine 1: 1-Entsprechung zu einem angegebenen verwalteten Thread. Derselbe verwaltete Thread kann auf mehreren nativen Threads ausgeführt werden und umgekehrt (obwohl offensichtlich nicht zur selben Zeit). MSDN:

Ein Betriebssystem ThreadId hat keine feste Beziehung zu einem verwalteten Thread, da ein nicht verwalteter Host die Beziehung zwischen verwalteten und nicht verwalteten Threads steuern kann. Insbesondere kann ein ausgeklügelter Host die Fiber-API verwenden, um viele verwaltete Threads für denselben Betriebssystemthread zu planen oder einen verwalteten Thread zwischen verschiedenen Betriebssystemthreads zu verschieben.

Dies gilt natürlich für alle auf den native Thread gebunden Ressourcen - aber die Laufzeit schafft es die verwalten Ressourcen eines Fadens, natürlich; und für nicht verwalteten Code, der zu verwaltetem Code aufruft, wird der Thread derselbe bleiben - andernfalls wäre Interop ziemlich unmöglich.

Wenn Sie Aufgaben zusätzliche Informationen hinzufügen möchten, versuchen Sie es mit einer höheren Abstraktionsebene - z. Task. Müssen Sie den Status einer Aufgabe nach Abschluss ausgeben? Fügen Sie eine Fortsetzung hinzu. Müssen Sie den Status einer Aufgabe überprüfen, für die Sie eine Referenz haben? Warte darauf oder frage das Task Objekt ab.

+0

"Derselbe verwaltete Thread kann auf mehreren nativen Threads ausgeführt werden", wie? –

+0

@MathuSumMut Warum nicht? Es ist in keiner Weise an native Threads gebunden. Die Laufzeit entscheidet, welche nativen Threads welche verwalteten Threads verarbeiten. – Luaan

+0

Warum sollte ein verwalteter Thread nicht 1: 1 mit einem nativen Thread verknüpft werden? Es tut, um die Interoperabilität zu erhalten. Ich weiß, dass Sie mit der technischen Spezifikation arbeiten, aber es gibt keine Vorteile, nicht 1: 1 zu mappen, und tatsächlich, um nicht mit der Implementierung zu tun zu haben, gibt es einen separaten Thread-Pool dafür. –

Verwandte Themen