2016-03-30 23 views
3

私はWPFアプリケーションを持っています。.ToListAsync()と.ToList()+ Task.Run

データはリポジトリからViewModelに持ち込まれます。どのようなデータを取得するためのより良い方法だろう:

方法1:リポジトリに

:ViewModelにで

public List<LogDetail> GetLogsOfTypeForCase(int caseId, LoggType logType) 
    { 
     using (var ctx = new SidraEntitiesNoChangesDetection()) 
     { 
      var logs = (from l in ctx.Loggs 
       where l.log_fk_caseid == caseId && l.log_operation == logType.ToString() 
       select new LogDetail() 
       { 
        ColumnName = l.log_columnname, 
        DateAndTime = l.log_dateandtime, 
        IdentificationDetail = l.log_identificationDetail, 
        NewValue = l.log_new_value, 
        OldValue = l.log_old_value, 
        TableName = l.log_tablename, 
        UserCode = l.User.usr_code 
       }).ToList(); 

      return logs; 
     } 
    } 

await Task.Run(
      () => 
      { 
       if (false == this.CancellationTokenSource.IsCancellationRequested) 
       { 
        this.CaseLogs = this.dataAdapter.GetLogsOfTypeForCase(this.CaseId, LoggType.S); 
       } 

      }, 
      this.CancellationTokenSource.Token 
      ); 

または 方法2

リポジトリに

:私が読んだものから、

public async Task<List<LogDetail>> GetLogsOfTypeForCase(int caseId, LoggType logType) 
    { 
     using (var ctx = new SidraEntitiesNoChangesDetection()) 
     { 
      var logs = await (from l in ctx.Loggs 
       where l.log_fk_caseid == caseId && l.log_operation == logType.ToString() 
       select new LogDetail() 
       { 
        ColumnName = l.log_columnname, 
        DateAndTime = l.log_dateandtime, 
        IdentificationDetail = l.log_identificationDetail, 
        NewValue = l.log_new_value, 
        OldValue = l.log_old_value, 
        TableName = l.log_tablename, 
        UserCode = l.User.usr_code 
       }).ToListAsync(); 

      return logs; 
     } 
    } 

とのViewModel

protected override async void Load() 
    { 
      if (false == this.CancellationTokenSource.IsCancellationRequested) 
      { 
       this.CaseLogs = await this.dataAdapter.GetLogsOfTypeForCase(this.CaseId, LoggType.S); 
      } 
    } 

では、方法1は、好ましいであろうが、何の利点も?

+1

? –

+0

もしあなたがそのうちの1つを読んだら、それが好まれるのであれば、確かに彼らはまた理由を言ったのですか?誰かが何か良いことを説明していないと言っているのを読んでいるのであれば、次の記事に進む。 –

+0

また、彼らが誰であっても、おそらく聞いてはいけません。彼らは明らかにタスクパラレルライブラリの仕組みを理解していません... –

答えて

7

スレッドが1つ少ないため、方法2が適しています。

また、(いくつかの修正を加えて)適切にサポートすることができますキャンセル:方法1であることが好ましく、その証拠は何と言った

public async Task<List<LogDetail>> GetLogsOfTypeForCase(int caseId, LoggType logType, CancellationToken token) 
{ 
    ... 
     }).ToListAsync(token); 
    ... 
} 

protected override async void Load() 
{ 
    this.CaseLogs = await this.dataAdapter.GetLogsOfTypeForCase(this.CaseId, LoggType.S, this.CancellationTokenSource.Token); 
} 
2

方法2.これらのメソッドの非同期バージョンは、あなたのために設計されたものであり、すべて「重いもの」です。 Task.Run()は大量のプロセスコールです。潜在的なエラーや失敗をすべて処理する必要があります。ここではハンマーを軽量化するハンマーは必要ありません。

これは、フレームワークが既に行っていることを作成しようとしていることを意味しています。非同期呼び出しが使われることになっています。

関連する問題