无法将类型 'bool' 隐式转换为 'System.Threading.Tasks.Task'

Cannot implicitly convert type 'bool' to 'System.Threading.Tasks.Task'

此方法从 wpf 主线程调用。 抛出 - 无法将类型 'bool' 隐式转换为 'System.Threading.Tasks.Task' 错误。 我究竟做错了什么? DocCollection 属于 ObservableCollection 类型。

Task TaskProcesQueue(SynchronizationContext _SyncContext)
{
    return Task.Run(() =>
    {
        if (DocCollection != null)
        {
            foreach (var item in DocCollection.ToList())
            {
                ProcessCurrentDocument(item);
                var t = Task.Run(() => DocCollection.Remove(item), _SyncContext));
            }
        }
    });
}

现在您的代码已同步,您的问题是 DocCollection.Remove(item) 实际上返回 true/false,这是一个指示删除是否成功的布尔方法。

如果你删除整行,一切都会很好地工作,并且项目将被处理(但不会删除)。

我想你想要的是实际使用 运行 任务的结果(注意它会阻塞)。

查看 official page on MSDN 了解更多信息。

Task.Run 没有接受 SynchronizationContext 的重载。因此,当重载解析启动时,它无法找到合适的重载。如果删除同步上下文,它会编译:

var t = Task.Run(() => DocCollection.Remove(item));

请注意,我建议您不要使用专用线程池线程从集合中删除项目。这似乎是多余的。相反,让线程池线程已经专用于删除项目:

while (DocCollection.Count > 0)
{
    ProcessCurrentDocument(item);
    DocCollection.Remove(item);
}

编辑:

如果你想 post 上 SynchronizationContext:

_SyncContext.Post(_ => { DocCollection.Remove(item) }, null);