1

由于我的IEnumerable. 具体来说,List<T>

这是我的工作流程:

List<string> IDs = getIDs();
RunTask(IDs);
RunTask(IDs);

public void RunTask(List<string> IDs)
{
    TaskScheduler scheduler = new TaskScheduler();
    TaskFactory factory = new TaskFactory(scheduler);
    var tasks = IDs.Select(name => factory.StartNew(() => action(name))).ToArray();
    Task.WaitAll(tasks);
}

我在WaitAll()通话中遇到一般性错误。

我的想法是我得到了某种不同步的 IEnumerator,我需要复制我的Listvia Array.CopyTo(),然后将它传递给我的多个线程。

这是我的例外:

Error: One or more errors occurred.
One or more errors occurred.
at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout)
at System.Threading.Tasks.Task.WaitAll(Task[] tasks)

对这个问题有什么想法吗?

4

1 回答 1

7

我不认为这是一个线程错误 - 只要每个任务不修改IDs列表,它就应该是安全的。Task.WaitAll()如果任何等待的任务抛出AggregateException异常或被取消,则抛出一个。

您可以访问InnerExceptions异常以查看错误是什么。

try
{
    Task.WaitAll(tasks);
}
catch(AggregateException ex)
{
    foreach(Exception in ex.InnerExceptions) { ... }
}
于 2012-10-12T18:55:39.027 回答