0

我目前正在研究 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 不为空。当我们在异步方法中时,我需要调度程序,它是空的。

任何指针?

兄弟,

波尔卡极端主义者

4

1 回答 1

2

首先,我强烈建议尽可能重构代码,这样就不需要显式捕获和恢复上下文。只要您只使用普通的asyncand 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我的MSDN 文章中有更多信息。

于 2013-02-25T03:18:58.223 回答