2013-02-24 28 views
0

我目前正在尋找兩個windows應用商店& wp8應用程序,都是sl和c#項目。windows store獲取調度員的正確方式,異步

提取調度程序與wpf不同,而且我有點不知所措,因爲Window.Current中的一個似乎在我的一些異步方法中消失了。

我所能做的只是基本上只是在App類中放置一個Propery,但它看起來很不安全,我不遵循這裏的邏輯。

我會後一個例子:

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不爲空。當我們使用異步方法時,我需要調度程序,它是空的。

任何指針?

Brgds,

polkaextremist

+0

Silverlight在Windows應用商店? – jv42 2013-02-25 13:32:56

回答

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

+0

歡呼! :)偉大的文章btw – 2013-05-09 15:02:45