2017-02-14 7 views
0

AsyncとAwaitを小さなC#WPFアプリケーションで使用しているため、長い処理操作がバックグラウンドで実行されている間にGUIがブロックされるのを防ぐことができます。私のアプリケーションのコンテキストは、CSVからデータを読み込んでXML文書に変換することです。Async C#でリスト/列挙型の余分な繰り返しが発生するのを待ちます

私は1999の項目の入力リスト・カウントで次のコマンドを実行すると、私はおよそ8000

**** Main Thread **** 
    outputItems = await CreateOutputItems(inputItems); 
**** End Main Thread **** 

public async Task<IEnumerable<ConvertedEntity>> CreateOutputItems(IEnumerable<InputEntity> inputItems) 
    { 
     return await Task.Run(() => inputItems.Select(CreateOutputItemFromInputItem)); 
    } 

そして、ときに私はこれを削除し、中に手続きループとしてそれを実行するの結果の反復回数で終わります私は正しい1999年の反復を取得します。

var convertedItems = new List<ConvertedEntity>(); 

foreach (var inputItem in inputItems) 
{ 
     var outputItem = CreateOutputItemFromInputItem(inputItem); 
     convertedItems.Add(outputItem); 
} 

はまた、私は待って非同期を使用した場合(単にループ/反復数である)ID番号が含まれている私のConvertedEntity内のフィールドが破損していることを指摘しました。例えば、値は2000年、4000年、6000年から30,000年までです。私はforeachループを使用するとき、1,2,3,4,5など期待どおりです。

アイデア?

+0

メソッドにブレークポイントを置き、複数回起動されていないことを確認します。手続き的に実行すると、ブロックされている可能性があります。したがって、イベントが複数回発生するのを防ぐことができます。非同期を実行すると、複数回実行できます。 –

+0

'foreach(item in inputItems.select(CreatOutputFromInputItem)){convertedItems.Add(item)}' ' –

+0

ブレークポイントは、@ JohnKoernerが一度ヒットするとどうなるのでしょうか? –

答えて

2

あなたは、インデックスとSelectのバージョンを使用して、正しくそうSelect(CreateOutputItemFromInputItem)後も.ToList()を追加するには、ID

public ConvertedEntity CreateOutputItemFromInputItem(InputEntity x, int i) 
{ 
    // now use i to set the ID 

を設定し、そのインデックスiを使用することができるようにあなたの方法にint入力パラメータを追加します。 Task.Run

+0

ToListを置くことで修正しました。したがって、非同期待機タスクではLINQの実際の実行が実際には起こっていないことが実際に問題になっているに違いありません。 –

関連する問題