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

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

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

Re[4]: 経過表示の方法を教えてください。


(過去ログ 127 を表示中)

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

■75029 / inTopicNo.1)  経過表示の方法を教えてください。
  
□投稿者/ よぽん (8回)-(2015/02/20(Fri) 09:16:05)

分類:[.NET 全般] 

環境は
Windows7 64bit
VisualStudio 2013
です。

データベースからデータを取得します。

private MAINDataSet.DATADataTable GetData()
{
 MAINDataSetTableAdapters.DATATableAdapter adpt = new MAINDataSetTableAdapters.DATATableAdapter();
 return(adpt.GetData());
}

ところが、データ量が多いため時間がかかります。
と、いっても10秒ぐらいなんですが

とはいえちょっと長めなので
プログレスバーを使って経過表示をしたいのですが
どのようにすればよいのでしょうか?
引用返信 編集キー/
■75046 / inTopicNo.2)  Re[1]: 経過表示の方法を教えてください。
□投稿者/ 774RR (222回)-(2015/02/23(Mon) 10:35:36)
真に「経過」つまり、データベースから1000件を取得するとして
・1/1000 とか 500/1000 とかそういう表示がしたい、のか
・単に「進行中」である表示がしたいのか
で話は違ってくると思うんだけど

後者なら Wait Cursor で十分なんでないかな・・・
http://www.atmarkit.co.jp/fdotnet/dotnettips/134waitcursor/waitcursor.html
Marquee なプログレスバーって手もありそう
http://dobon.net/vb/bbs/log3-52/30605.html

前者な対応は手間なだけなので俺なら却下
引用返信 編集キー/
■75241 / inTopicNo.3)  Re[2]: 経過表示の方法を教えてください。
□投稿者/ ひよこ (2回)-(2015/03/08(Sun) 15:56:40)
データセットを用いず、ODBC接続などとループ文で取得するようにして
backgroundWorkerを使用するくらいしか思いつきません
遅くなる可能性がありますが。。。

http://hiros-dot.net/CS2005/Control/BackGroundWorker/BackGroundWorker03.htm
引用返信 編集キー/
■75350 / inTopicNo.4)  Re[3]: 経過表示の方法を教えてください。
□投稿者/ ふるふる (1回)-(2015/03/18(Wed) 12:00:01)
昔、ADODBのころは非同期でSQLを実行というのがあったので、ADO.Netでもできないかと調べたら、できるようですね。
SqlCommand.BeginExecuteNonQuery() メソッド。

例:
http://vb.netde業務アプリ.com/62.htm

戻り値のIAsyncResult.AsyncState の内容が良くわからないのですが、ループ中にAsyncStateの内容を使って進捗度合いがわかるんじゃないでしょうか。


引用返信 編集キー/
■75353 / inTopicNo.5)  Re[4]: 経過表示の方法を教えてください。
□投稿者/ 魔界の仮面弁士 (243回)-(2015/03/18(Wed) 13:46:21)
No75350 (ふるふる さん) に返信
> ループ中にAsyncStateの内容を使って進捗度合いがわかるんじゃないでしょうか。
AsyncState は「SQL Server の現在の処理状況」を示すものではなく、
呼び出し時に「BeginExecuteNonQuery の第二引数に指定したオブジェクト」です。


> 例:
> http://vb.netde業務アプリ.com/62.htm

せっかくの非同期メソッドなのに、それをポーリング(ループ待機)させて
DoEvents で回避というのは、あまり良い実装ではありません。

たとえば CheckBox がチェックされた時に処理を行いたい…という場合、
CheckBox1.Chekced の状態をループ監視したりはしないはずです。
普通は CheckedChanged イベントを使って、そこに処理を書きますよね。

ADODB の非同期処理も同じで、State プロパティをループで監視するのではなく、
ExecuteComplete イベントで通知を受ける方が自然な実装なはず。


プロパティを定期的に確認して、終了したかどうかを確認する実装パターンは、
たとえば、3秒間隔でタイマー監視する場合などのように、
他の処理の合間に『時々』確認するような場面で使われます。
(あるいは、ワーカスレッドにて AsyncWaitHandle を待たせるとか)

一方、非同期処理の終了後、『即座』に何かを行いたいのであれば、
イベントやデリゲートなどのコールバック通知の仕組みを使います。
BeginExecuteNonQuery メソッドの場合は、第一引数に、コールバック先の
デリゲートまたはラムダ式を渡してやれば OK です。


なお、こうした Being/End メソッドによる非同期ペアは、
VB2012 以降の Asnyc/Await で処理することもできます。
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -