由于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,我需要通过List
制作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)
对此事有何想法?
答案 0 :(得分:7)
我不认为这是一个线程错误 - 只要每个任务都不修改IDs
列表,它就应该是安全的。如果任何等待的任务抛出异常或被取消,Task.WaitAll()
将抛出AggregateException
。
您可以访问异常上的InnerExceptions
以查看错误。
try
{
Task.WaitAll(tasks);
}
catch(AggregateException ex)
{
foreach(Exception in ex.InnerExceptions) { ... }
}