2012-04-11 2 views
2

Ist es möglich, während der Ausführung des Delegaten durch einen Kontextwechsel ausführbare Threads zu wechseln?Kann P-Linq während der Delegate-Ausführung Threads wechseln?

Ich habe dieses Snippet in LinqPad ein paar Mal versucht, und es trifft nicht die new Exception() Zeile, die darauf hinweist, dass es auf dem ursprünglichen Thread weitergehen wird, aber vielleicht ist mein kleiner Test hier nicht geeignet, dies zu testen, I ' Ich bin mir einfach nicht sicher.

void Main() 
{ 
    var list = Enumerable.Range(1,100000); 
    list.AsParallel().ForAll(i=> 
    { 
     var threadId = System.Threading.Thread.CurrentThread.ManagedThreadId; 
     System.Threading.Thread.Sleep(0); // allow a context switch 
     work(i,threadId); 
    }); 
    "Complete".Dump(); 
} 

void work(int num,int threadId) 
{ 
    var currentId = System.Threading.Thread.CurrentThread.ManagedThreadId; 
    if(threadId!=currentId) 
    { 
     throw new Exception(); 
    } 
} 

Antwort

3

Wenn eine Aufgabe es wird immer geplant ist und für immer den ersten Thread ihn zugeordneten zu verwenden. Dieser Thread hört möglicherweise auf zu laufen und lässt einen anderen Thread (aus dem Thread-Pool oder nicht) etwas arbeiten, und der gesamte Prozess kann angehalten werden, damit ein anderer Prozess etwas arbeiten kann, aber egal, was Sie immer wieder im Thread landen Sie haben begonnen.

+0

Wunderbar, würden Sie zufällig einen MSDN-Link für weitere Informationen haben? Ich konnte nichts finden. – asawyer

+0

@asawyer Ich weiß nicht, wo das in MSDN oder den Sprachspezifikationen dokumentiert ist (obwohl ich sicher bin, dass Sie es irgendwo finden werden). Ich könnte dir nur Zitate aus anderen Q/A Foren oder Blogs geben. – Servy

2

Nein - dieselbe Methode kann die Ausführung in einem Thread nicht starten und in einem anderen beenden. Denken Sie einmal darüber nach - jeder Thread hat seinen eigenen Stack und wenn es möglich wäre, dann würde jeder Kontextwechsel den Stack kopieren.

In Ihrem Beispiel nach Kontextwechsel Zeitscheibe wird einem anderen Thread gegeben, aber es wird ein weiterer Code ausgeführt werden. Dieser andere Code kann in der gleichen Methode sein, aber Call-Stack wäre andere und wird auch andere sein.

So werden Sie nie Ihre Ausnahme sehen.

+0

Ihr Recht macht total Sinn, danke. – asawyer

Verwandte Themen