2010-08-31 57 views
1

如下面的代碼所示,我在foreach循環中創建一個線程並在稍後運行它們,但是當我運行線程時「對象引用未設置爲對象的實例」錯誤。我懷疑這是一個關閉問題,但似乎我正在盡我所能通過創建值的本地副本來避免這種情況。如何糾正這些代碼以完成線程的創建,然後在稍後允許調用方法(線程啓動)?爲什麼捕獲的變量沒有持有對象實例的引用

foreach (ObjWithDelegateToCreateTrdFrom item in queryResult) 
{ 
    // Capture object state  
    ObjWithDelegateToCreateTrdFrom capturedValue = item; 

    // Create thread from object 
    Thread thread = new Thread(() => 
    { 
     capturedValue.Method.Invoke(capturedValue.paramsArray) 
    }); 

    // Add thread to temp thread list 
    trdList.Add(thread); 
} 
+3

什麼是異常的堆棧跟蹤?你確定它是''capturedValue'引用是null嗎? – thecoop 2010-08-31 13:11:13

+4

你的代碼對我來說看起來很好。無論出於何種原因,「capturedValue.Method」可能爲空嗎? (或後來被設置爲空?) – Heinzi 2010-08-31 13:12:11

回答

2

檢查的值:

  1. capturedValue
  2. capturedValue.Method
  3. capturedValue.paramsArray
在lambda體,即在時刻

時執行線程。

即使它們在創建線程時不爲null,它們也可能在初始化線程對象的時間與運行時決定執行它的時間之間設置爲null。

+0

你是對的。最好在lambda體內檢查。你所說的可能發生的恰恰是我的問題,我完全沒有注意到它。 – 2010-08-31 16:26:30

1

試試這個:

foreach (ObjWithDelegateToCreateTrdFrom item in queryResult) 
{ 
    if (item == null) 
    { 
     throw new InvalidOperationException("Item is null"); 
    } 

    if (item.Method == null) 
    { 
     throw new InvalidOperationException("Item.Method is null"); 
    } 

    if (item.paramsArray == null) 
    { 
     throw new InvalidOperationException("Item.paramsArray is null"); 
    } 

    // Create thread from object 
    Thread thread = new Thread(() => 
    { 
     capturedValue.Method.Invoke(capturedValue.paramsArray) 
    }); 

    // Add thread to temp thread list 
    trdList.Add(thread); 
} 

如果這不能解決您的問題,請給我們更多的信息,堆棧跟蹤。

+0

查看下面的解決方案,這是更準確的imo。 – Grozz 2010-08-31 14:32:16

+0

@Stepen - 感謝代碼示例!我正在lambda體內實現你的解決方案。 – 2010-08-31 16:27:08

相關問題