3

私のアプリ (Windows 8 Metro) では、いくつかのオブジェクトをローカル フォルダーにシリアル化された形式で保存します。読み返す方法は次のとおりです (以下を参照)。

このメソッドを Task.Run で呼び出すと、次のオブジェクトを取得できます。

var entity= Task.Run<Entity>(() => GetASync<Entity>(file)).Result;

しかし、await キーワードを使用すると機能しません。メソッドの行 A (ReadObject) でスレッドが停止し、エラーや例外なしで終了します。

var entity= await GetASync<Entity>(file);

推奨されているように、 await / async を使用しないのでしょうか。

方法

private async Task<T> GetASync<T>(IStorageFile file) where T : class
{
    try
    {    
        if (file != null)
        {
            IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read);
            IInputStream inputStream = readStream.GetInputStreamAt(0);                   
            using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(inputStream.AsStream(), XmlDictionaryReaderQuotas.Max))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                var entity = serializer.ReadObject(reader); //line A - here the problem 
                return entity as T;
            }                    
        }
        else
        {
            return null;
        }

    }
    catch (FileNotFoundException)
    {
        return null;
    }
    catch (Exception)
    {
        throw;
    }
}
4

2 に答える 2

1

http://social.msdn.microsoft.com/Forums/en-US/async/thread/3f192a81-073a-47ea-92e2-5ce02bf5ad33からのピングバック:

MicrosoftがBUILD会議で配布した.NET開発者プレビューバージョンで既知の問題が発生しています。この問題は、WinRTUIスレッドの微妙な詳細が原因で発生します。その結果、マネージコードからのWinRTストリームIOのブロックは、UIスレッドから実行された場合、デッドロックにつながります。非同期IO(例ReadAsync)は正常に機能します。開発チームは問題を認識しており、修正に取り組んでいます。

ただし、問題が修正された場合でも、UIスレッドでブロッキングIOを実行することはお勧めできません。操作中、アプリケーションはブロックされ、応答しなくなります。一部の.NETAPIには、(まだ)非同期に相当するものがありません。一度同期したとしても、コードの変換には作業が必要になる場合があります。ブロッキングIO操作を実行する必要がある場合は、必ずスレッドプールにオフロードしてください。

DoUIStuff();
Int32 x = await Task.Run(() => {
    OpenStream();
    PerformBlockingIO();
    ProcessResults();
    return ComputeIOResults();
});
UseIOResults(x);

このようにして、アプリケーションを常に応答性の高い状態に保ちます。副作用として、上記のバグを回避し、デッドロックを回避することもできます。

于 2011-12-21T07:51:28.763 に答える