这是涉及的代码:

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);
    }
}


哪里:


SelectIObservable<TResult> Select<TSource, TResult>(this IObservable<TSource> source, Func<TSource, TResult> selector)中的System.Reactive.Linq.Observable
ToListIObservable<IList<TSource>> ToList<TSource>(this IObservable<TSource> source)中的System.Reactive.Linq.Observable
ToTaskTask<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/

10-13 09:31