我目前正在调查这两个Windows应用商店和wp8应用程序,都是sl和c#项目。
获取调度程序与wpf不同,我有点麻烦,因为Window.Current中的那个似乎在我的一些异步方法中消失了。
我所能做的只是在App类中放置一个属性,但它似乎不安全,我不遵循这里的逻辑。
我会发一个例子:
internal class MainviewModel : ViewModelBase
{
..............
private async void GetLastDocumetAsync()
{
// Window.Current is null here, but not outside async!
await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
ObservableCollection<ScannedDocument> docs = await ServiceLocator.DocumentClient.GetLastScannedDocumentsAsync();
ScannedDocuments.AddRange(docs);
SelectedDocument = ScannedDocuments.LastOrDefault();
}
}
...
public void SomeMethod(){
// Window.Current is not null
Task.Factory.StartNew(() => GetLastDocumetAsync());
}
}
调用SomeMethod()时,Window.Current不为null。当我们处于异步方法中时,我需要调度程序,它是空的。
任何指针?
Brgds,
polkaextremist
答案 0 :(得分:2)
首先,我强烈建议尽可能重新构建代码,以便不必显式捕获和恢复上下文。只要您使用普通async
和await
,就不需要捕获上下文。
在您的示例代码中,不需要StartNew
,因此您可以执行以下操作:
private async Task GetLastDocumentsAsync()
{
ObservableCollection<ScannedDocument> docs = await ServiceLocator.DocumentClient.GetLastScannedDocumentsAsync();
ScannedDocuments.AddRange(docs);
SelectedDocument = ScannedDocuments.LastOrDefault();
}
public async Task SomeMethodAsync()
{
await GetLastDocumentsAsync();
...
}
如果您真的做需要明确捕获上下文,我建议您使用SynchronizationContext
。您可以将其视为跨平台Dispatcher
;我在my MSDN article中有更多信息。