2013-11-28 36 views
1

我正在使用任務來執行一些過程。任務將在一個循環中,我不確定有多少任務/迭代將在那裏。它會隨時間變化。如何使用任務?以下是我的代碼。雖然使用任務[]對象引用未設置爲對象的實例

void func1(string loc) 
{ 
    var CurrentDirectoryInfo = new DirectoryInfo(loc); 
    Task[] tasks; // null 
    int index = 0; 

    foreach (DirectoryInfo D1 in CurrentDirectoryInfo.GetDirectories) 
    { 
     tasks[index] = Task.Factory.StartNew(() =>func1(d1.FullName)); 
     index++; 
    } 

如果我使用空爲Task[] tasks,我得到Object reference not set to an instance of an object錯誤。

如果我將其未分配,我得到Use of unassigned variable錯誤。

+2

這是非常非常糟糕的代碼。您應該重新訪問您對「StartNew」的瞭解,並決定是否需要爲每個目錄/子目錄創建單獨的任務。機會是......你沒有(你的電腦有多少核心?)。 –

+0

如果'tasks'是任何其他數據類型,並且您試圖訪問實例方法/屬性,您將如何解決該問題? –

+0

此問題的根源與任務無關,因此應該重新命名並重新標記。 –

回答

1

如果您不知道在編譯時需要多少任務對象,則可以使用任務列表。

List<Task> tasks = new List<Task>(); 

在列表中添加新創建的takss。

foreach(DirectoryInfo D1 in CurrentDirectoryInfo.GetDirectories) 
{ 
    tasks.Add(Task.Factory.StartNew(() =>func1(d1.FullName))); 
} 

用於爲目錄對象創建任務對象的代碼沒有意義。你應該考慮替代方法,你可以通過更有效的方式使用單一任務來實現這一點。

+0

我需要等待任務完成。如何在這種情況下使用WaitAll? – user3044315

+0

是WaitAll可以使用。 – Adil

+0

怎樣才能以更有效的方式在單線程中完成?我想在每個任務上計算一些消耗一些時間的東西。 – user3044315

相關問題