3

基本的に、私のコードは、Windows8スタイルのアプリでファイルの書き込みと読み取りを行うための非常に簡単なテストです。ここでは、文字列「Jessie」が最初にdataFile.txtに書き込まれ、次にプログラムによって読み取られて、xamlのTextblockのTextプロパティを更新できるようになります。

msdnのサンプルから、WriteTextAsyncとReadTextAsyncは、Windows8プログラミングのファイルへのdataFileアクセス用であることがわかりました。ただし、テスト結果では、WriteTextAsync関数は実際には機能しますが、ReadTextAsyncは機能しません(「Jessie」がdataFile.txtに書き込まれた実際のtxtファイルを確認できますが、変数strは常にnullです)。

私はインターネットから同様の質問を見たことがありますが、それらに対する答えはどれも私には意味がありません。多くの回答は、問題がReadTextAsyncがタスクの使用などの非同期関数である可能性があると述べていますが、それらのソリューションのすべてが私のコードでは機能しません。私の質問は、ReadTextAsyncを使用して同期的に戻り値を取得する方法、またはUIを同期的に更新できるようにWindows8アプリのtxtファイルからデータを読み取る他の方法はありますか?

コードは次のとおりです。

public sealed partial class MainPage : Page
{  
    Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

    public MainPage()
    {
        this.InitializeComponent();

        Write();
        Read();
    }

    async void Write()
    {
        StorageFile sampleFile = await localFolder.CreateFileAsync("dataFile.txt", Windows.Storage.
                  CreationCollisionOption.ReplaceExisting);

        await FileIO.WriteTextAsync(sampleFile, "Jessie");
    }

    async void Read()
    {
        try
        {      
            StorageFile sampleFile = await localFolder.GetFileAsync("dataFile.txt");
            string str = await FileIO.ReadTextAsync(sampleFile);

            Text.DataContext = new Test(str, 1);
        }
        catch (FileNotFoundException)
        {

        }
    }

    public class Test
    {
        public Test() { }

        public Test(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public string Name { get; set; }
        public int Age { get; set; }

        // Overriding the ToString method
        public override string ToString()
        {
            return "Name: " + Name + "\r\nAge: " + Age;
        }
    }
}

どうもありがとう。

4

1 に答える 1

2

可能な限りではなく、asyncメソッドを返す必要があります。async/awaitの投稿の紹介が役立つかもしれません。非同期コンストラクターに関するブログ投稿もあります。Taskvoid

コンストラクターにすることはできませんがasync、コンストラクターから非同期プロセスを開始できます。

public MainPage()
{
  this.InitializeComponent();
  Initialization = InitializeAsync();
}

private async Task InitializeAsync()
{
  await Write();
  await Read();
}

public Task Initialization { get; private set; }

async Task Write() { ... }
async Task Read() { ... }
于 2012-09-11T04:32:10.853 に答える