2016-08-20 8 views
0

私はこのようなTask.WhenAll()を使用することができますので、私はTask[]配列を設定しています:タスク<IEnumerable>を使用して結果を処理するにはどうすればよいですか?

Task[] tasks = new Task[2]; 

     tasks[0] = _widgetDataService.RetrieveAsync<CollaboratorNetworkNode>(
      "get_collaborator_nodes", portfolio, 
      recentFys, nodesSwitch); 

     tasks[1] = _widgetDataService.RetrieveAsync<CollaboratorNetworkEdge>(
      "get_collaborator_edges", portfolio, recentFys); 

     await Task.WhenAll(); 

コードが正常に動作してTask.WhenAllにブレークポイントを取得します。

は、しかし、今、私はこのコードを実行するために行く:

var nodes = from pi in (IEnumerable<CollaboratorNetworkNode>)tasks[0] 
        select new GraphNode { Id = pi.ProfileId, Properties = pi, Labels = new[] { "Person" } }; 

を、私は、エラーメッセージが表示されます。

「タイプ のオブジェクトをキャストすることができませんSystem.Threading.Tasks.Task'1 [System.Collections.Generic.IEnumerable'1 [Nete.Ireport.Models.ViewModels.CollaboratorNetworkNode]] ' ' System.Collections.Generic.IEnumerable'1 [Nete.Ireport.Models.ViewModels.CollaboratorNetworkNode] 'と入力すると、 と入力します。

私はこれを実行しよう:

var nodes = from pi in tasks[0] 
        select new GraphNode { Id = pi.ProfileId, Properties = pi, Labels = new[] { "Person" } }; 

私は波線赤を取得するので、私はコンパイルすることはできません。

タスクは、選択のための定義と最高の拡張が含まれていません メソッドのオーバーロード "DynamicQueryable.Select(IQueryable、string、params オブジェクト[]はIQueryableタイプの受信者が必要です)

これらの2つのRetrieveサービスをそれぞれ10秒間実行しようとしています。だから私たちの呼び出しは20秒です。 私は今13〜15秒でブレークポイントに達しています。 私はこれを働かせることができれば、私は5から7秒を削った。

しかし、私はどのように結果を使用するのか分かりません。

どうすればこの方法を完了できますか?

+2

Task.Resultを使用する必要があります。タスクを(タスクとは対照的に)普通の 'Task'として扱っている場合は、' .Result.' –

+2

'awaitにアクセスするためには、まずキャストする必要があります。Task.WhenAll() ;これは何もするつもりはない.... –

+0

Glorin - もう少し詳細を教えてもらえますか? – Sam

答えて

1

あなたがWhenAll方法にタスクの配列を渡す必要があります。

await Task.WhenAll(tasks); 

次にあなたがResultプロパティを使用して結果格納することができます:リターンであるものは何でも

var result1 = (Task[0] as Task<IEnumerable<CollaboratorNetworkNode>>).Result; 
var result2 = (Task[1] as Task<IEnumerable<CollaboratorNetworkEdge>>).Result; 

変更上記を非同期に呼び出すメソッドのタイプ。

注:Taskがまだ完了していない場合は、Task.Resultを使用してください。

+0

ありがとうございました。それはそれだった。 あなたはちょうど私がこの方法から6秒間シェービングを手伝った。 – Sam

0

あなたの関数_widgetDataService。RetrieveAsyncはおそらくタイプで、タスクの戻り値を持つ< IEnumerableを< CollaboratorNetworkNode>>

あなたは、タスクの配列にこれらの戻り値を置くが、< IEnumerableを< CollaboratorNetworkNode>>

var tasks = new Task<IEnumerable<CollaboratorNetWorkNode>>[][2]; 
tasks[0] = _widgetDataService.RetrieveAsync<CollaboratorNetworkNode>(
     "get_collaborator_nodes", portfolio, 
     recentFys, nodesSwitch); 

tasks[1] = _widgetDataService.RetrieveAsync<CollaboratorNetworkEdge>(
     "get_collaborator_edges", portfolio, recentFys); 
await Task.WhenAll(tasks); 
var nodes = tasks[0].Result.Select(pi=> new GraphNode 
{ 
    Id = pi.ProfileId, 
    ... 
}) 
タスクの配列ではいけません
0

問題を引き起こしているのはあなたの配列宣言です。ハラルドが示唆したように、それはむしろTaskを使用してタイプ情報を廃棄するよりも、適切なTask<T>タイプを使用する必要があります。私が可能(このコードがないように)await Task.WhenAllの結果を使用することを推奨し

var tasks = new Task<IEnumerable<CollaboratorNetworkNode>>[2]; 
tasks[0] = _widgetDataService.RetrieveAsync<CollaboratorNetworkNode>(
     "get_collaborator_nodes", portfolio, 
     recentFys, nodesSwitch); 
tasks[1] = _widgetDataService.RetrieveAsync<CollaboratorNetworkEdge>(
     "get_collaborator_edges", portfolio, recentFys); 
var results = await Task.WhenAll(tasks); 
// results[0] is IEnumerable<CollaboratorNetworkNode> 
// results[1] is IEnumerable<CollaboratorNetworkNode> 

var nodes = from pi in results[0] 
      select new GraphNode { Id = pi.ProfileId, Properties = pi, Labels = new[] { "Person" } }; 

。可能でない場合(つまり、タスクが異なるタイプの場合)、awaitを使用してを検索すると、Resultではありません。 Resultは、エラー処理を複雑にするAggregateExceptionに例外をラップします。

関連する問題