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 は null ではありません。非同期メソッドを使用していて、ディスパッチャーが必要な場合、それは null です。

ポインタはありますか?

ブルグズ、

ポルカ過激派

4

1 に答える 1

2

まず、コンテキストの明示的なキャプチャと復元が不要になるように、コードをできるだけ再構築することを強くお勧めします。asyncプレーンなandを使用する限り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 に答える