2015-10-07 65 views
4

我有一个通用任务的集合,标记为执行。当任务完成时(使用Task.WaitAny),我将其添加到ObservableCollectionTask.WaitAny接受任务<T>而不是任务[]

但是,这个问题是在Task.WaitAny(...)线,这表示从任务<的MyType > []对写入操作任务[]可能会导致运行时异常联合变量数组转换。

我对这个例外意味着什么以及为什么在这个阶段抱怨很了解。

问:有没有通用版的Task.WaitAny(),这可能需要Task<T>作为参数,而不是Task[]

在此先感谢。

code

+1

的可能的复制[有没有一个通用的Task.WaitAll?](http://stackoverflow.com/questions/10044099/is-there-a-generic-task-waitall) –

+0

@chuex该问题的答案已过时。现在有更好的办法。 –

+1

@Nair:为什么可观察集合*中的任务开始于?当然,他们不是数据绑定... –

回答

2

有一个通用Task.WhenAny

public static Task<Task<TResult>> WhenAny<TResult>(IEnumerable<Task<TResult>> tasks); 
public static Task<Task<TResult>> WhenAny<TResult>(params Task<TResult>[] tasks); 

await它获得完成任务。

+0

感谢您的支持。对不起,我正在使用.NET 4. – Nair

+0

@Nair如果您在VS 2012或更高版本中使用.NET 4,则可以从nuget获取Microsoft.Bcl.Async包并使用TaskEx.WhenAny。 –

2

您可以使用Task.WhenAny而你的情况甚至会简化代码这样

var result = new ObservableCollection<LenderScoreCard>(); 
var parallelScoreList = parallelScore.ToList(); 
while (parallelScoreList.Count != 0) 
{ 
    var completedTask = Task.WhenAny(parallelScoreList).Result; 
    result.Add(completedTask.Result); 
    parallelScoreList.Remove(completedTask); 
} 
+0

感谢您的支持。对不起,我正在使用.NET 4. – Nair

+0

@Nair:Np,然后只是忽略警告 - “Task.WaitAny”不会修改传递的数组。 –