这是涉及的代码:
private static async Task DoRunInOrderAsync<TTaskSeed>(SemaphoreSlim sem, IObservable<TTaskSeed> taskSeedSource, CreateTaskDelegate<TTaskSeed> createTask, OnTaskErrorDelegate<TTaskSeed> onFailed, OnTaskSuccessDelegate<TTaskSeed> 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>(T taskSeed, CreateTaskDelegate<T> createTask, OnTaskErrorDelegate<T> onFailed, OnTaskSuccessDelegate<T> 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);
}
}
哪里:
Select
是IObservable<TResult> Select<TSource, TResult>(this IObservable<TSource> source, Func<TSource, TResult> selector)
中的System.Reactive.Linq.Observable
ToList
是IObservable<IList<TSource>> ToList<TSource>(this IObservable<TSource> source)
中的System.Reactive.Linq.Observable
ToTask
是Task<TResult> ToTask<TResult>(this IObservable<TResult> observable)
中的System.Reactive.Threading.Tasks.TaskObservableExtensions
System.Reactive.Linq版本是2.2.5.0
据我所知,一切都已构建,周围没有陈旧的二进制文件。该错误经常发生,但并非总是如此。
在我的生命中,如果
tasks
方法是null
,我将无法理解GetPendingOrRunningTask
列表如何包含async Task
?编辑
因此
ToList
注入null
。怎么样?为什么?我在做什么错(除了以编程为生)? 最佳答案
您可能有比赛条件。.ToList()
调用List<T>
构造函数。代码是here。
如果taskSeedSource
中的元素数量在构造函数开始和结束之间改变,则可能导致列表不一致。特别要看第94行。
ICollection<T> c = collection as ICollection<T>;
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;
}
}
关于c# - 任务列表中空条目的奇怪出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27412560/