无法将类型 '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);
此方法从 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);