C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

非同期のDBアクセスの記述方法

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■83438 / inTopicNo.1)  非同期のDBアクセスの記述方法
  
□投稿者/ ぼよん (1回)-(2017/03/23(Thu) 17:00:02)

分類:[C#] 

VS2016のC#を使ってDBアクセスのサンプルを作っています。
実は・・・私はほとんどC#を書いたことがなくて、過去にVB6で作ったツールをC#の勉強しつつ作り直そうとしています。

コードはしょりますが、使うオブジェクトは以下です。

using IBM.Data.DB2;

DB2Connection con;
DB2DataReader reader = null;

cmd = con.CreateCommand()
cmd.CommandText = azukiScript.Text;

同期処理なら、
reader = cmd.ExecuteReader();
これで、うまく操作できました。
非同期の場合がどうやればよいのかわかりません。
Task task = cmd.ExecuteReaderAsync();
と、書くのでしょうか???
その場合、後続はどう書くべきなんでしょうか?

ExecuteReaderAsync で検索しても、使用例がまったくHitしないためさっぱりです。

どなたかよきアドバイスをお願いします。

引用返信 編集キー/
■83535 / inTopicNo.2)  Re[1]: 非同期のDBアクセスの記述方法
□投稿者/ shu (991回)-(2017/03/27(Mon) 13:49:37)
No83438 (ぼよん さん) に返信

> 非同期の場合がどうやればよいのかわかりません。
> Task task = cmd.ExecuteReaderAsync();
> と、書くのでしょうか???
> その場合、後続はどう書くべきなんでしょうか?
ExecuteReaderAsyncは使ったことがないですが
これはTask型のインスタンスが作成されているだけなので
多分実行はされていないのではないでしょうか?
Startで実行して
ContinueWithで継続処理を続けていくと思われます。

別スレッドを作成してその中でExecuteReaderを
行ったほうがよいかもしれません。
引用返信 編集キー/
■83555 / inTopicNo.3)  Re[2]: 非同期のDBアクセスの記述方法
□投稿者/ もりお (33回)-(2017/03/27(Mon) 23:02:12)
No83535 (shu さん) に返信

ExecuteReaderAsyncは内部でTaskFactory.FromAsyncを呼び出していて
↓こんなの見つけました

https://msdn.microsoft.com/ja-jp/library/dd997423(v=vs.110).aspx
| FromAsync タスクの開始とキャンセル
|
| FromAsync メソッドから返されるタスクの状態は WaitingForActivation で、
| タスク作成後のある時点でシステムによって開始されます。
| このようなタスクで Start を呼び出そうとすると、例外が発生します。

実行は自動的にされるみたいです。

引用返信 編集キー/
■83563 / inTopicNo.4)  Re[3]: 非同期のDBアクセスの記述方法
□投稿者/ ぼよん (2回)-(2017/03/28(Tue) 11:14:41)
おふた方、ありがとうございます。

少し調べてみましたが、前提スキルが低すぎて理解がおよびません。
「非同期」を私が取り違えてるのでしょうか。
ほにゃららAsync のメソッドがいくつか用意されているもののこれらは何が違うのでしょうか。

VB6+RDO で作ってたツールを非同期で組んでたので、そのままC#で作り直そうとしています。
SQLの実行結果は RDOのコネクションオブジェクトからイベントハンドラーで通知されるような仕組みでした。
なんとなく task や async などかなあと 調べつつ進めるも、サンプルがなさすぎます。
世間一般ではやらないのでしょうかね???

独学ははじめの一歩が一番しんどいですね。
ハードル高いなぁ・・・と感じてます。

引用返信 編集キー/
■83567 / inTopicNo.5)  Re[4]: 非同期のDBアクセスの記述方法
□投稿者/ なちゃ (204回)-(2017/03/28(Tue) 13:28:17)
Taskを利用する非同期処理そのままなので 、Taskの例や使い方を見るのが早いです。
戻り値有りのTaskの使い方と同じです。
awaitとかと組み合わせて使ったりします。
引用返信 編集キー/
■83570 / inTopicNo.6)  Re[5]: 非同期のDBアクセスの記述方法
□投稿者/ ぼよん (3回)-(2017/03/28(Tue) 14:51:11)
No83567 (なちゃ さん) に返信
> Taskを利用する非同期処理そのままなので 、Taskの例や使い方を見るのが早いです。

そうします!
ここに良さそうな情報がありましたので試してみますね。
http://www.kekyo.net/2016/12/06/6186
引用返信 編集キー/
■83591 / inTopicNo.7)  Re[6]: 非同期のDBアクセスの記述方法
□投稿者/ 渋木宏明 (7回)-(2017/03/29(Wed) 22:34:11)
async/await 構文を使うのが推奨です。
引用返信 編集キー/
■83632 / inTopicNo.8)  Re[7]: 非同期のDBアクセスの記述方法
□投稿者/ ぼよん (4回)-(2017/03/31(Fri) 11:59:06)
その後、いくつかのサイトを参考にTASKを勉強してました。
ここを見ながら async/await をためしました。
http://www.atmarkit.co.jp/ait/subtop/features/dotnet/app/masterasync_index.html

reader = DBCommand.ExecuteReader は動作したのですが、その結果をDataGridやStripなどのUIに展開するときに
「コントロールが作成されたスレッド以外のスレッドからコントロール xxxxx がアクセスされました。」
のエラーが出てこけます。

UIスレッド以外で、コントロールに触れてはいけないみたいですね。
※正直なところスレッドの意味もよくわかっていませんでした。プロセスの1階層下でCPUが割り振られるぐらいに考えてます。
じゃあ、どうするのと調べてたら、Invokeやdelegateなどのキーワードが出てきます。
このあたりはまだ意味がよく判っていません。

やりたいことはDBへのSELECTした結果をGRIDに展開するまで、UIを止めず、途中でキャンセルができるようにしたいのです。
基本的な考え方というか、作り方が間違ってるんじゃないかなとも思ったりしています。

ご意見いただけないでしょうか。
引用返信 編集キー/
■83633 / inTopicNo.9)  Re[8]: 非同期のDBアクセスの記述方法
□投稿者/ shu (996回)-(2017/03/31(Fri) 12:24:31)
No83632 (ぼよん さん) に返信

> やりたいことはDBへのSELECTした結果をGRIDに展開するまで、UIを止めず、途中でキャンセルができるようにしたいのです。
> 基本的な考え方というか、作り方が間違ってるんじゃないかなとも思ったりしています。
>
BackgroundWorkerを使って
DoWorkで読み取りを行い
RunWorkerCompletedでUIへの設定を行うのがよいかと思います。

BackgroundWorkerのMSDNの例
https://msdn.microsoft.com/ja-jp/library/cc221403(v=vs.95).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3
引用返信 編集キー/
■83635 / inTopicNo.10)  Re[9]: 非同期のDBアクセスの記述方法
□投稿者/ ぼよん (5回)-(2017/03/31(Fri) 13:50:24)
ありがとうございます。BackgroundWorkerですか。いろいろあるもんですね。

Query待ちのキャンセル方法を調べていませんが、
BackgroundWorkerの中で処理すればQuery待ちでも、結果の描画でも、
ひとつのCancelAsyncで止めれるのかなと思いました。
そうなると、DBのほにゃららAsyncメソッドの出番がまったくないんですがどう使い分けるんでしょうね。
とにかく、試してみたいと思います。

引用返信 編集キー/
■83639 / inTopicNo.11)  Re[10]: 非同期のDBアクセスの記述方法
□投稿者/ なちゃ (205回)-(2017/03/31(Fri) 15:57:24)
〜Asyncが提供されている場合は基本的にそれが一番効率がいいですしasync/awaitと組み合わせたら簡単に使えます。

var reader = await cmmand.ExecuteReaderAsync();

// ここからreader使った処理

ってやるだけです基本的には。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ