C# と IBM Data Server Provider for .NET を利用してちょっとしたプログラムを書いています。
※私はc#自体が不慣れです。
やりたいのは SQLを非同期で実行し、途中でキャンセルできるようなロジックです。
Task/async/await について調べてサンプルを真似しながら作ったのですが、非同期になりませんでした。
ExecuteReaderAsyncを実行することは可能ですが戻りの型が DB2DataReaderではなくSystem.Data.Common.DbDataReader でした。
DbDataReaderをDB2DataReaderにcastすると、以降の処理では正しく動きますが、非同期ではなく通常の同期処理でした。
var cmd = con.CreateCommand() var reader = await cmd.ExecuteReaderAsync(); //戻りはDbDataReader
どうもExecuteReaderAsync というメソッドがサポートされていないようです。
Db2のオンラインマニュアルにも記載がありませんでした。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.swg.im.dbclient.adonet.ref.doc/doc/DB2CommandClass.html
Db2のオンラインマニュアルにはThreadによる実行のキャンセルのサンプルが記載されていました。
これはTask/async/awaitを利用して非同期処理を組めないということなんでしょうか?
もしくはExecuteReaderを実行するメソッドに何らかのロジックを組めば非同期を実現できるのでしょうか?
Visual Studio 2019 / .Net 4.7.2 を利用しています。
DB2Connection con; DB2DataReader reader = null; private async void ButtonSelectAsync_Click(object sender, EventArgs e) { using (var cmd = con.CreateCommand()) { cmd.CommandText = "SELECT文(省略)"; try { reader = await DB2ExecuteReaderAsync(cmd); DataReaderを参照し画面に出す処理をここに書く(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private static async Task<DB2DataReader> DB2ExecuteReaderAsync(DB2Command cmd) { try { //非同期でSQLを実行 DB2DataReader readerAsync = null; readerAsync = (DB2DataReader)await cmd.ExecuteReaderAsync; return readerAsync; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } }
回答1件
あなたの回答
tips
プレビュー