从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));
}
}
});
}
答案 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了解更多信息。