这是我问题的一个小例子,我无法从关于同一错误的其他问题中解决它。
UI 线程通过具有以下行的按钮单击调用函数:
await DataSet.AddFileAsync(String.Format("ms-appdata:///local/IMM_FACE_DB/{0}", file.Name));
AddFileAsync 如下所示:
public ObservableCollection<Model> Data {get;set;}
public Task AddFileAsync(string path)
{
return Task.Factory.StartNew((state) =>
{
// Here some IO and computation is done, eventually some content is added
// to Data. Data is also bound to a GridView and this fails.
//I assumed that TaskScheduler.FromCurrentSynchronizationContext()
// would solve this, but it does not.
}, TaskScheduler.FromCurrentSynchronizationContext());
}
正如我在上面的代码中所写,我假设任务计划程序可以确保它在 UI 线程上运行。由于 AddFileAsync 是从数据绑定按钮单击命令调用的。
我在哪里误解了什么? 以及这样做的正确等待是什么。
我可以看到StartNew
没有必要...
public async Task AddFileAsync(string path)
{
// Do some IO
var ioResult = await DoIoAsync(path);
// Do some computation
var computationResult = await Task.Run(() => DoComputation(ioResult));
// Update Data
Data.Add(computationResult);
}