2017-02-05 19 views
0

ログライブラリを作成しましたが、ログメソッドはエラー番号(PK)を返します.DBに入力すると、エラーメッセージの一部としてユーザーに通知されますUI。彼らはさらに、チームをサポートするために話すときに、そのキーを参照として使用します。非同期メソッドでの非同期ライブラリメソッドの使用

そして、私は以下のように、同じことを行うための非同期メソッドを持っています。

public class Logger 
{ 
    public async Task<string> LogAsync(Exception ex) 
    { 
    return await DoLogAsync(ex); 
    } 

    // some private method, with multiple optional parameters 
    private Task<string> DoLogAsync(Exception ex) 
    { 
    return Task.Run(() => Log(ex)); 
    } 
} 

注:私は認めざる、この非同期バージョンは何もありませんが、単に同期方法、ログ(ラップ)、タスクに。私は確信していません、他に何をすべきです!

今、私は以下のように、すべての私のAPIに上記ログイン()メソッドを、使用することを計画しています:

public Result<MyObject> Get() 
{ 
    var result = new Result<MyObject>(); 

    try 
    { 
    throw new DivideByZeroException(); 
    } 
    catch (DivideByZeroException ex) 
    { 
    string errorId = await _logger.LogAsync(ex); 
    response.AddErrorMessage("Please Contact Admin with this error #"+errorId); 
    } 

    return result; 
} 

仕事の上にするために、私はAPIメソッドの非同期を行う必要があり、私はロガーコールを待っているからです。

  1. Loggerのためだけに、私のAPIコールasyncを変更しないようにするにはどうすればよいですか?この仕事をする他の可能性は何ですか?
  2. LogAsync()は本当に有益でしょうか?私のUIスレッドは、エラー番号が返されるのを待っているので、なぜsyncメソッドを呼び出さないのですか?
  3. Log()のメソッドはほとんどありません。エラー番号は必要ありませんが、代わりにlog-and-forgetの種類があります。このようなシナリオでは、非同期バージョンが役立つと思いますが、UIでは何も期待していないでしょうか?

回答:質問1の場合、この作品:Waiting for async/await inside a task

をまた2、および3のために、あなたの場合はADO.Netの実装はかなりTask.Run

+0

が、これはWebアプリケーションですか? – JohanP

+0

これはC#です...タグの中に入れてください:) – ymz

+1

C#は言語です。 ASP.NetアプリケーションとWeb APIにはC#を使用できます。 – JohanP

答えて

0

よりも、あまり意味がありますWeb APIを使用していますasyncLogメソッドがない場合は、真にasyncのメソッドはありません。スティーブン・クレアリーの答えはthisです。

+0

うわー..私は非同期メソッドを公開する必要はありません。むしろ私は内部のADO.Net非同期メソッドを利用するでしょう。ありがとう – Skip

+1

あなたのアプリケーションでDBアクセスのためにADO.Netを使用しているなら、あなたは 'async'メソッドを使うべきです。つまり、 'Log'メソッドは' async' thoですが、 'Task.Run'でラップする必要はありません。 – JohanP

+0

アドバイスをお願いします。はい;私はそれらをうまく利用することができます – Skip

0

コード内でasync-awaitアプローチを使用する場合は、asyncがアプリケーションのパイプライン全体に拡散することに注意してください。

だから私はちょうど ロガーのために、私のAPI呼び出しの非同期を変更しないでくださいどのように

?この仕事をする他の可能性は何ですか?

回答:async

を使用しないでくださいあなたが思う、LogAsync()は本当に有益でしょうか?私のUIスレッドは エラー番号がとにかく返されるのを待つことになるので、どうして ちょうど同期メソッドを呼び出すのですか?

回答:待っている間、UIが「反応的」になるという利点があります。たとえば、ユーザーはアプリケーションのウィンドウを別の画面に移動したり、最小化することができます。

エラー番号が不要なLog()メソッドは、 リターン、log-and-forgetの種類にはほとんどありません。このようなシナリオでは、非同期バージョンは となると思います。

回答:前の回答と同じ

+0

ありがとうございます。だから、APIを非同期にするのではなく、別の投稿で提案されているように、以下のように使用したいと思います: 'var t = Task.Run(async()=> {lwa.lib.LogAsync();});' このアプローチにはどんな面も影響していると思いますか? – Skip

+0

副作用:何もしないためにのみ別のスレッドを予約/作成してリソースを無駄にする。 IO操作(データベースクエリ)では、スレッドは要求を送信して応答を待機します。ありがとうございます; – Fabio

+0

;それは、このシナリオでは、非同期でより良いと思う – Skip

関連する問題