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 に答える