2009-05-24 21 views
1

Ich suche nach einem Weg für einen Faden, an der anderen Thread es hervorgebracht wurde ursprünglich zu bestimmen. Ich weiß nicht, ob ein Mechanismus existiert, um dies zu tun, ähnlich wie die "Parent" -Eigenschaft auf Aufgaben in der neuen Task Parallel Library für .NET Edit: Weitere Untersuchung scheint tatsächlich darauf hinzuweisen, dass es keine Position zu geben speichern Sie diese Informationen, so kurz vor wirklich hässlichen Hacks scheint dies nicht möglich zu sein, transparent zu implementieren..NET Framework thread „Herkunft“

Als solche denke ich, ich werde den untenstehenden Beispielcode als die machbarste (nicht transparente) Antwort akzeptieren, um das Problem zu lösen, obwohl ich selbst nach einem alternativen Design suchen muss. Thanks :)

Antwort

2

Das System ist nicht eine solche Funktionalität intern bereitstellt. Sie können die Thread-ID des Muttergewindes an die Thread-Start-Funktion ziemlich leicht passieren:

static class ThreadSpawner 
{ 
    [ThreadStatic] 
    private static int parentThreadId; 
    public static int ParentThreadId 
    { 
     get { return parentThreadId; } 
    } 

    private class ThreadInfo 
    { 
     public int ParentId; 
     public Action Method; 
    } 

    private static void StartThread(object parameter) 
    { 
     var threadInfo = (ThreadInfo)parameter; 
     parentThreadId = threadInfo.ParentId; 
     threadInfo.Method(); 
    } 

    public static void Spawn(Action start) 
    { 
     new Thread(StartThread).Start(
      new ThreadInfo { 
       Method = start, 
       ParentId = Thread.CurrentThread.ManagedThreadId 
      }); 
    } 
} 


// Usage: 
ThreadSpawner.Spawn(MyMethod); 

static void MyMethod() { 
    Console.WriteLine(ThreadSpawner.ParentThreadId); 
} 
+0

Ich verstehe, was Sie versuchen, hier zu tun. Leider kann ich in meinem Szenario nicht kontrollieren, wie der Code, der die Threads erstellt, dies tut. Ich möchte dies in einer Bibliothek tun, also muss ich in der Lage sein, dies herauszufinden, unabhängig davon, wie die Threads entstanden sind. – jerryjvl

2

Schlimmer noch, einen .NET-Thread zu schaffen bieten keine Garantie für einen native Thread bekommen, so dass Sie nicht in der Lage, auf abhängen können Die Thread-Elterninformationen mit P/Invoke aufrufen.

Ich weiß, wenn Sie Testcode schreiben, sehen Sie den nativen Thread, aber es ist nicht erforderlich, um es zu generieren und unter einigen Bedingungen, die schwer zu erraten sind, wird es nicht.

EDIT: Thread-Eltern über P/Invoice trotzdem nicht abrufen können.

+0

ich nicht hatte gegraben, dass tief noch wurde für eine .NET-basierte Lösung basierend auf verwalteten Threads der Hoffnung ... aber wenn nichts anderes hilft, könnte ich in der P interessiert sein/Invoke APIs ermöglicht den Zugriff auf die native Thread-Informationen .. – jerryjvl

+0

Ich denke, ich habe gerade gesagt, dass es nicht immer funktionieren wird. Es gibt keine 1-1-Zuordnung zwischen verwalteten Threads und nativen Threads. Nun, wenn Sie wirklich einen Aufruf von CreateThread aufrufen möchten, finden Sie möglicherweise eine Lösung, oder Sie finden möglicherweise einen wirklich schlechten Absturz (ich kann nicht raten, was). – Joshua

+0

Ich bin mir voll bewusst, Sie sagten, es wird nicht immer funktionieren, aber untersuchen alle Möglichkeiten zu deren Abschluss kann entweder geben mir Inspiration für eine alternative Lösung oder zumindest geben Sie mir eine ‚Sonderfall‘ Lösung, die ausreichend sein kann. Als solcher versuche ich den Mechanismus für die "walk the thread parent information" herauszufinden, auf den Sie in Ihrer ursprünglichen Antwort anspielen. – jerryjvl