1

(async & await) で問題が発生している単純な Metro スタイル アプリがあります。

List<string> fileNames = new List<string>();
...
...
LoadList();
...
...
(Problem) Code that accesses the elements of the fileNames List
...
...

private async void LoadList()
{
    // Code that loops through a directory and adds the 
    // file names to the fileNames List using GetFilesAsync()
}

問題は、fileNames リストが時期尚早にアクセスされることです - 項目が完全に読み込まれる前に。
これは非同期メソッドによるものです。非同期メソッドが処理を続行している間、プログラムは次のコード行に進みます。

リストが完全にロードされた後 (非同期メソッドが実行された後)、リストにアクセスするにはどうすればよいですか?

Metro アプリで async を使用せずに、私がやろうとしていることを達成する方法はありますか?

4

1 に答える 1

3

呼び出し元のメソッドも非同期にする必要があります。変数を にするのではなくfileNamesLoadListメソッドがそれを返すようにします。したがって、次のようになります。

public async Task ProcessFiles()
{
    List<string> fileNames = await LoadList();
    // Now process the files
}

public async Task<List<string>> LoadList()
{
    List<string> fileNames = new List<string>();
    // Do stuff...
    return fileNames;
}

これは、ファイルの処理を開始する前に、すべてのファイルが見つかるまで待つ必要があることを意味します。それらを見つけたときに処理したい場合はBlockingCollection、何らかの種類のを使用することを考える必要があります。編集: Stephen が指摘するように、TPL Dataflowはここでも最適です。

于 2012-09-28T22:22:23.850 に答える