任务列表中空条目的奇怪外观

这是涉及的代码:

private static async Task DoRunInOrderAsync(SemaphoreSlim sem, IObservable taskSeedSource, CreateTaskDelegate createTask, OnTaskErrorDelegate onFailed, OnTaskSuccessDelegate onSuccess) where TTaskSeed : class { var tasks = await taskSeedSource .Select(taskSeed => GetPendingOrRunningTask(taskSeed, createTask, onFailed, onSuccess, sem)) .ToList() .ToTask(); await Task.WhenAll(tasks); } private static async Task GetPendingOrRunningTask(T taskSeed, CreateTaskDelegate createTask, OnTaskErrorDelegate onFailed, OnTaskSuccessDelegate onSuccess, SemaphoreSlim sem) where T : class { Exception exc = null; await sem.WaitAsync(); try { var task = createTask(taskSeed); if (task != null) { await task; } onSuccess(task, taskSeed); } catch (Exception e) { exc = e; } sem.Release(); if (exc != null) { onFailed(exc, taskSeed); } } 

哪里:

  • SelectIObservable Select(this IObservable source, Func selector)System.Reactive.Linq.Observable IObservable Select(this IObservable source, Func selector)
  • ToList是来自System.Reactive.Linq.Observable IObservable<IList> ToList(this IObservable source)
  • ToTask是来自System.Reactive.Threading.Tasks.TaskObservableExtensions Task ToTask(this IObservable observable)
  • System.Reactive.Linq版本是2.2.5.0

在此处输入图像描述

据我所见,一切都是建立的,周围没有陈旧的二进制文件。 错误经常发生,但并非总是如此。

对于我的生活,如果GetPendingOrRunningTask方法是async Task ,我无法理解tasks列表如何包含null

编辑

在此处输入图像描述

所以ToList注入null 。 怎么样? 为什么? 我做错了什么(除了为生活而编程)?

你可能有竞争条件。

.ToList()调用List构造函数。 代码在这里 。

如果taskSeedSource的元素数量在构造函数启动和完成之间发生变化,则可能最终会出现不一致的列表。 特别是看第94行。

 ICollection c = collection as ICollection; if( c != null) { int count = c.Count; if (count == 0) { _items = _emptyArray; } else { _items = new T[count]; c.CopyTo(_items, 0); /* it's possible there are now fewer elements in c */ _size = count; } }