2013-03-04 43 views
1

我真的不明白任務和線程。 我有內部三個層次的嵌套for,我希望在不同的線程/任務多次運行的方法,但我傳遞給方法的變量去瘋狂,讓我跟一些代碼解釋:在c#中同時運行相同方法的多個實例而沒有數據丟失?

List<int> numbers=new List<int>(); 
for(int a=0;a<=70;a++) 
{ 
    for(int b=0;b<=6;b++) 
    { 
    for(int c=0;b<=10;c++) 
    { 
     Task.Factory.StartNew(()=>MyMethod(numbers,a,b,c)); 
    } 
    } 
} 
private static bool MyMethod(List<int> nums,int a,int b,int c) 
{ 
    //Really a lot of stuff here 
} 

這是嵌套,myMethod真的做了很多事情,比如計算一些數字的階乘,寫入不同的文檔,用組合列表匹配響應和調用其他小方法,它也有一些返回值(布爾值),但目前我不關心他們。 問題是沒有任何任務結束,它就像每次嵌套調用它刷新自身的方法,刪除以前的實例。 它也給出了一個錯誤,「嘗試分爲0」,其值爲FOR由FOR分隔的值,例如a=71, b=7, c=11以及所有變量爲空(這就是爲什麼除以零)。我真的不知道如何解決它。

+1

'myMethod'或'MyMethod'?你將'int'傳遞給myMethod的第一個參數。 'MyMethod'以'List '作爲第一參數。當你的代碼沒有意義時,很難提供幫助。 – spender 2013-03-04 14:48:00

+0

我的壞,編輯和糾正 – 2013-03-04 14:51:15

+0

「這是巢,myMethod真的做了很多事情」。方法不應該做很多事情,但一件事。這有助於解決您遇到的問題。 – 2013-07-05 14:22:31

回答

6

的問題是,您使用的是已經或將您的closure /λ外部修飾的變量。你應該得到一個警告,說「訪問修改關閉」。

你可以把你的循環變量爲當地人首先解決它,並使用這些:

namespace ConsoleApplication9 
{ 
    using System.Collections.Generic; 
    using System.Threading.Tasks; 

    class Program 
    { 
    static void Main() 
    { 
     var numbers = new List<int>(); 

     for(int a=0;a<=70;a++) 
     { 
     for(int b=0;b<=6;b++) 
     { 
      for(int c=0;c<=10;c++) 
      { 
      var unmodifiedA = a; 
      var unmodifiedB = b; 
      var unmodifiedC = c; 

      Task.Factory.StartNew(() => MyMethod(numbers, unmodifiedA, unmodifiedB, unmodifiedC)); 
      } 
     } 
     } 
    } 

    private static void MyMethod(List<int> nums, int a, int b, int c) 
    { 
     //Really a lot of stuffs here 
    } 
    } 
} 
+0

非常感謝,這是完美的解決方案! – 2013-03-04 16:12:32

+0

這也適用於C#5.0嗎?我的理解是,關於閉包和可變捕獲將會有一個突破性的變化。 – 2013-03-04 17:15:55

+0

@ChrisDunaway這個改變只適用於'foreach'。 – svick 2013-03-04 17:23:25

相關問題