2012-04-11 51 views
2

執行代理切換執行線程時是否可以執行上下文切換?在委託執行過程中,P-Linq可以切換線程嗎?

我在LinqPad上試了幾次這段代碼,它沒有打到new Exception()這一行,這似乎表明它會繼續在原來的線程上,但也許我的小測試不足以測試這個,米不確定。

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(); 
    } 
} 

回答

3

當任務計劃時,它將永遠使用分配給它的第一個線程。該線程可能會停止運行並讓另一個線程(來自線程池或不)執行一些工作,並且可以暫停整個進程以讓另一個進程執行某些工作,但無論您總是在線程中返回什麼結果你開始了。

+0

很棒,你會碰巧有一個MSDN鏈接瞭解更多信息?我無法找到任何東西。 – asawyer 2012-04-11 19:18:50

+0

@asawyer我不知道MSDN或語言規範中記錄了哪些內容(儘管我相信您會在某處找到它)。我只能給你其他Q/A論壇或博客的報價。 – Servy 2012-04-11 19:32:26

2

否 - 相同的方法不能在一個線程中開始執行並在另一個線程中完成。試想一下 - 每個線程都有自己的堆棧,如果可能的話每個上下文切換都會複製堆棧。

在你的例子中,上下文切換時間片將被賦予另一個線程,但它將執行另一個代碼。另一個代碼可能採用相同的方法,但調用堆棧將是其他方法,並且threadiId也是其他方法。

所以你永遠不會看到你的例外。

+0

您的權利是完全合理的,謝謝。 – asawyer 2012-04-11 19:37:29