1

Windowsストアアプリのバックグラウンドタスクからファイルを読み取れないようです。ファイルの内容を読み取るコードは次のとおりです。

async private static Task<string> ReadAsync(string FileName)
{
    var folder = ApplicationData.Current.LocalFolder;
    var file = await folder.GetFileAsync(FileName);
    Windows.Storage.Streams.IRandomAccessStreamWithContentType inputStream = null;
    try
    {
        inputStream = await file.OpenReadAsync();
    }
    catch (Exception ex)
    {
        throw (ex);
    }
    string content = string.Empty;
    using (Stream stream = inputStream.AsStreamForRead())
    {
        using (StreamReader reader = new StreamReader(stream))
        {
            try
            {
                // *** program exits on this line
                content = await Task.Run(() => reader.ReadToEnd());
            }
            catch(Exception ex)
            {
                // no error is caught
                content = ex.Message;
            }
        }
    }

    return content;
}

プログラムは、StreamReaderでReadToEnd()を呼び出す行で終了します。trycatchブロックでエラーはキャッチされません。出力ウィンドウで次のようになります。

プログラム'[8968]backgroundTaskHost.exe:Managed(v4.0.30319)'がコード1(0x1)で終了しました

バックグラウンドタスクでファイルにアクセスすることは可能ですか?もしそうなら、私はどこが間違っているのですか?

4

2 に答える 2

7

コードを投稿していただければ助かりますIBackgroundTask。それを見ずに、あなたがその中を呼んでいないのではないかと思いますGetDeferral()。例:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    var deferral = taskInstance.GetDeferral();
    var contents = await ReadAsync("MyFile.txt");
    deferral.Complete();
}

GetDeferral()バックグラウンドタスク内で非同期呼び出しを行うときはいつでも呼び出す必要があります。このようにして、非同期呼び出しが完了するのを待つ必要があり、Run終了するとすぐにバックグラウンドタスクを停止しないようにランタイムに指示します。

完了したら、つまり通常はメソッドの最後で、延期インスタンスをRun呼び出して、実行が完了したことをランタイムに通知する必要があります。Complete()

于 2012-11-14T05:50:02.113 に答える
-1

ファイルを非同期で読み取るためのシステムクラス(DataReader)がすでに存在するため、独自のクラスを作成することにした理由がわかりません。

于 2014-05-13T12:52:46.010 に答える