2013-11-28 40 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

相关问题