无法隐式转换类型';bool';到';System.Threading.Tasks.Task';

本文关键字:System Threading Tasks Task bool 转换 类型 | 更新日期: 2023-09-27 17:57:26

此方法是从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));
            }
        }
    });
}

无法隐式转换类型';bool';到';System.Threading.Tasks.Task';

Task.Run没有接受SynchronizationContext的过载。因此,当过载决议生效时,它无法找到合适的过载。如果删除同步上下文,它将编译:

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

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

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

编辑:

如果你想在SynchronizationContext:上发帖

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

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

如果您要删除整行,那么所有内容都会很好地工作,并且项目会被处理(但不会被删除)。

我认为您想要的是实际使用运行任务的Result(注意它会阻塞)。

查看MSDN上的官方页面了解更多信息。