2017-08-31 2 views
2

このコードで何が問題なのか分かりませんが、依然として必要な値に応答しません。ここで非同期タスクとスタックされたままになる

は私のサンプルコードです:

WebAPIの2:

KOTController.cs

[HttpGet] 
[Route("testasync")] 
public IHttpActionResult TestAsync() 
{ 
    try 
    { 
     return Ok(_iKOTManager.TestAsync()); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     return null; 
    } 
} 

インタフェース

IKOTManager.cs

Task<int> TestAsync(); 

KOTManager.cs

public async Task<int> TestAsync() 
{ 
    return await Task.Run<int>(() => 
    { 
     return 999 + 23; 
    }); 
} 

私はこのAPIにリクエストを送信し、それがこのようなものではない数

<TaskOfint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Threading.Tasks"/>

を返します。

アドバイスは本当に役に立ちます。ありがとうございました。

+3

リファクタリングタスクを戻し、インタフェース上でメソッドを待機させるアクション – Nkosi

答えて

4

あなたはタスクを返し、実際には実行していないので、その応答が得られます。フレームワークは単にタスクオブジェクトをシリアライズして戻しています。

リファクタリングインターフェイス上Task、その後await方法を返すように行動

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() { 
    try { 
     return Ok(await _iKOTManager.TestAsync()); 
    } catch (Exception ex) { 
     logger.Error(ex); 
     return InternalServerError(); 
    } 
} 

参考:Async/Await - Best Practices in Asynchronous Programming

また、例外の場合には、あなたが代わりにnullの適切な結果を返す必要があります。コントローラ内でのエラー処理はcross-cutting concernと考えられるため、最終的にリファクタリングする必要があります。コントローラは可能な限りリーンでなければなりません。

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() { 
    return Ok(await _iKOTManager.TestAsync()); 
} 
3

コントローラーをasyncに変更し、次にawaitに変更する必要があります。すなわち

public async Task<IHttpActionResult> TestAsync() 

...

return Ok(await _iKOTManager.TestAsync()); 

async/awaithereのマニュアルを参照してください。

0

あなたのアクションメソッドが非同期メソッドを呼び出す/消費している、あなたのような戻り値の型としてTask<T>を返す非同期だけでなく、あなたのアクションメソッドを作成する必要があります。

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() 
{ 
    try 
    { 
     return Ok(await _iKOTManager.TestAsync()); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     return null; 
    } 
} 

我々は非同期に呼び出す場合可能ならば、呼び出し側のメソッドとasyncを作成し、すべての呼び出しチェーンでTask<T>を返す必要があります。

希望すると助かります!

関連する問題