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

时间:2015-06-21 07:13:57

标签: c# wpf multithreading task

从wpf主线程调用此方法。 投掷 - 无法隐式转换类型' bool' to' 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));
            }
        }
    });
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

如果您删除整行,则所有内容都会正常运行,并且会处理项目(但不会删除)。

我认为你想要的是实际使用运行任务的结果(注意它虽然阻止了)。

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