2011-03-15 23 views
1

我是多線程的新手,我一直在做一個概念驗證,我也發現了(VS2008)線程窗口: enter image description here試圖解釋(VS2008)線程窗口與什麼實際執行

我的問題是:我該如何將運行線程「鏈接」到我的代碼?例如,我將如何獲得線程ID(如線程窗口中所示),以便我可以記錄它(例如); BeginInvoke()方法需要一個我設置的'id'參數(字符串)(在下面的例子中爲「Service A」),但我在Threads窗口中看不到它。

我感興趣的事情是,我引發了執行使用AsyncCallbacks而BeginInvoke(的並行線程),但我只能看到在線程窗口兩個工作線程在一個地步,我想我應該能看到三。其實我想我可以 - 三個工作線程的'名稱'爲<No Name>

僅供參考這裏的一些我使用的代碼:

// Creating the call back and setting the call back delegate 
AsyncCallback callBackA = new AsyncCallback(AsyncOperationACompleted); 
// callBackB ... 
// callBackC ... 

// Create instances of the delegate, which calls the method we want to execute 
callerA = new DumbEndPoint.AsyncMethodCaller(DumbEndPoint.PretendWorkingServiceCall); 
// callerB ... 
// callerC ... 

// sleep = thread sleep time in milliseconds 
IAsyncResult resultA = callerA.BeginInvoke(sleep, "Service A", callBackA, null); 
// resultB ... 
// resultC ... 

// I expect to see three threads in the Threads Window at this point. 

然後我得到的結果在回電話委託:

private void AsyncOperationACompleted(IAsyncResult result) 
    { 
     try 
     {    
      string returnValue = callerA.EndInvoke(result); 
      mySmartDTO.ServiceDataA = returnValue; 
     } 
     catch (Exception ex) 
     { 
      // logging 
      ... 
     } 
    } 

回答

2

您可以使用Thread.Name來爲該線程設置一個名稱。名稱設置後,它將出現在「線程」窗口的「名稱」列中。

例如,假設Service A是要出現在線程窗口的名稱列中,你可以做這樣的事情在PretendWorkingServiceCall名稱:

void PretendWorkingServiceCall(int sleepMilliseconds, string name) 
{ 
    System.Threading.Thread.CurrentThread.Name = name; 

    // your code goes here 
} 
+0

呀 - 我的位白癡。我剛剛意識到,在玩了更多:)後,一件事,但Thread.CurrentThread.ManagedThreadId返回一個完全不同的ID。 – 2011-03-15 04:17:59

+0

@Adrian K:對於非託管線程ID(這是您在線程窗口中看到的),請參閱AppDomain.GetCurrentThreadId()。但是,可能存在託管線程ID與非託管線程ID不是一對一的情況。如果您使用此方法,您將得到的文檔和編譯器警告將進一步解釋細節。 – 2011-03-15 05:05:16