0

Windowsストアアプリケーション(別名Metro)用の単純なユーティリティコレクションを持っていますが、連続して呼び出すとハングしているように見えますApplicationData.Current.LocalFolder.GetFileAsync(つまり、デバッグしてステップスルーしようとすると、問題は解消されます) 。

    public static async Task<LocalCache<T>> LoadCache()
    {
        try
        {
            // Get the input stream for the cache
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(GetFileNameForType());
            using (IInputStream inStream = await file.OpenSequentialReadAsync())
            {
                // Deserialize the cache
                DataContractSerializer serializer = new DataContractSerializer(typeof(LocalCache<T>));
                return (LocalCache<T>)serializer.ReadObject(inStream.AsStreamForRead());
            }
        }
        catch (FileNotFoundException)
        {
            return new LocalCache<T>();
        }
    }

ファイルを開くモードを指定するためのオーバーロードはないようで、戻ってこないように見えるので、ちょっと困惑しました。このデッドロックを防ぐにはどうすればよいですか?

4

1 に答える 1

4

The most likely cause of this is further up your call stack; I'm guessing there is probably a call to Wait or Result. This will result in deadlock (as described on my blog).

If you're blocking because this is part of initialization or a constructor, then you may be interested in asynchronous lazy initialization (also described on my blog).

于 2012-09-30T16:55:59.673 に答える