我有一个方法在for循环中的约20个对象上运行。我希望循环的每次迭代都以新任务执行该方法,以防止在工作进行时GUI停滞。但是,我注意到在创建任务之后,我在输出中出现了System.ArgumentOutOfRangeException
错误。最终,整个应用会因System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index'
而崩溃。
我的第一个想法是这是循环中的一个简单错误,当前的迭代索引不匹配,但事实并非如此。
这是我的循环:
Collection<string> tableNames = GetTableNames(path); //just gets a collection of strings
var tasks = new List<Task>();
for (int i = 0; i < tableNames.Count; i++)
{
var addTask = Task.Run(() => { AddLayer(tableNames[i]); });
tasks.Add(addTask);
}
await Task.WhenAll(tasks);
ResumeRefresh(); //I want this to be called after all the tasks complete
不确定这是否重要,但是在for循环中AddLayer
方法的末尾是一个作用在GUI控件上的函数调用,因此我在函数调用处执行此操作:
private void AddLayer(string tableName)
{
//some work done here
Application.Current.Dispatcher.BeginInvoke((Action)(() => Map.Layers.Add(layer)))
}