2017-11-26 18 views
2

同期I/Oバウンド方式(下記)から、async/awaitを使用して非同期にするにはどうすればよいですか?既存のC#同期メソッドをasync/awaitと非同期に変換しますか?

public int Iobound(SqlConnection conn, SqlTransaction tran) 
{ 
    // this stored procedure takes a few seconds to complete 
    SqlCommand cmd = new SqlCommand("MyIoboundStoredProc", conn, tran); 
    cmd.CommandType = CommandType.StoredProcedure; 

    SqlParameter returnValue = cmd.Parameters.Add("ReturnValue", SqlDbType.Int); 
    returnValue.Direction = ParameterDirection.ReturnValue; 
    cmd.ExecuteNonQuery(); 

    return (int)returnValue.Value; 
} 

MSDNの例はすべて、*非同期メソッドの先在を推定し、I/Oバウンドの操作を自分でものを作るためのガイダンスを提供しません。

この新しいタスク内でTask.Run()を実行してIobound()を実行できますが、操作がCPUにバインドされていないため、新しいタスクの作成はお勧めしません。

私はasync/awaitを使用したいと思いますが、私はこの方法の変換を進めるこの基本的な問題についてここで取り残されています。この特定の方法の

+4

はなぜちょうど 'ExecuteNonQueryAsync()'を使わないのでしょうか? –

+2

SqlCommandで 'using'を使用してください。 – slugster

+0

Google検索を行うには、あなたのメソッドを飾る方法の例がたくさんあります。タスク<> – MethodMan

答えて

7

変換はかなり単純明快です:

// change return type to Task<int> 
public async Task<int> Iobound(SqlConnection conn, SqlTransaction tran) 
{ 
    // this stored procedure takes a few seconds to complete 
    using (SqlCommand cmd = new SqlCommand("MyIoboundStoredProc", conn, tran)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlParameter returnValue = cmd.Parameters.Add("ReturnValue", SqlDbType.Int); 
     returnValue.Direction = ParameterDirection.ReturnValue; 
     // use async IO method and await it 
     await cmd.ExecuteNonQueryAsync(); 
     return (int) returnValue.Value; 
    } 
} 
+0

@MikeZ次に、このメソッドを非同期にする必要はありません。 Asyncは非同期IO(あなたが気づいているようです)のためであり、すべてのIOは最近非同期バージョン(ファイル、ソケット、データベース、Web要求など)を持っています。カウンターの例がある場合は、それを入力してください。 – Evk

+0

ありがとう!しかし、私は別の例を選ぶべきだった。この場合、既存の* AsyncメソッドExecuteNonQueryAsync()が存在し、I/Oバインドされた呼び出しのために別の本体と既存の* Asyncメソッドがないと想定します。 I/O-boundコードには推奨されていないTask.Run()の同期コードをラップすることなく、Iobound()をIoboundAsync()に変換する方法はありますか? – MikeZ

+2

@MikeZ私は上記に答えました。非同期バージョンを持たないIOの例を挙げてください。あなたが書いた他の同期IOメソッドを意味するならば、最初に非同期に変換する必要があります。だから、非同期はずっと下がっていなければならない。 – Evk

関連する問題