windows存储获取调度程序的正确方法,异步

时间:2013-02-24 19:03:49

标签: windows-store-apps silverlight-5.0 dispatcher

我目前正在调查这两个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

1 个答案:

答案 0 :(得分:2)

首先,我强烈建议尽可能重新构建代码,以便不必显式捕获和恢复上下文。只要您使用普通asyncawait,就不需要捕获上下文。

在您的示例代码中,不需要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中有更多信息。