WindowsアプリでWEB巡回ツールのような物を作っているのだが
WEBの巡回なので完了までに非常に時間がかかる。
巡回する数にもよるけど1時間以上かかることもざら。
そんなのを同期処理でやってたらたまらないし 途中で中断したいケースもあるのに
同期処理だと中断ボタンを押すこともでいない
なので非同期で呼び出すように実装してみた。
いろいろ悩んだ部分もあるけど おおむねうまく動いている
独自クラスもいくつか作ってるのでこのままコピペしても動かないけれど
イメージとしてはこんな感じ。
ボタンクリックイベント{
//新しいスレッドを作成
threads = new Thread(new ParameterizedThreadStart(startThreadMain));
threads.IsBackground = true;
//スレッドで処理するqueueを引数で渡して起動
threads.Start(thqueues);
}
delegate void CloseDelegate();
private void startThreadMain(Object o) {
//スレッド内での処理をするQueue
ThreadQueue thqueue = (ThreadQueue)o;
try {
//メイン処理を行う
//MainClass.Main内でWebBrowserをNEWしてWEBから情報を取得し
//その結果をFormアプリに結果を返す
DeleMain main = new DeleMain (MainClass.Main);
//
IAsyncResult ret = this.BeginInvoke(main, new object[] { thqueue });
//登録処理が終わるまで待つ
ret.AsyncWaitHandle.WaitOne();
if (ret.IsCompleted) {
object obj = this.EndInvoke(ret);
}
//終了時の処理
//終了メッセージを画面表示
Invoke(new CloseDelegate(finish));
} catch (Exception ex) {
//エラー処理
}
}
ただ自分の実装方法が悪いのかもしれないけど1日中動かしていると2,3回処理が止まってしまうことがある。
CPU使用量もメモリ使用量もたいしたことないのになぜ。。。
目下原因を調査中(笑)
MainClass.Mainの中でもいろいろ複雑なことやってるからそっちが問題の可能性が高いので とりあえずこちら側は公開しておきます(笑)
WEBの巡回なので完了までに非常に時間がかかる。
巡回する数にもよるけど1時間以上かかることもざら。
そんなのを同期処理でやってたらたまらないし 途中で中断したいケースもあるのに
同期処理だと中断ボタンを押すこともでいない
なので非同期で呼び出すように実装してみた。
いろいろ悩んだ部分もあるけど おおむねうまく動いている
独自クラスもいくつか作ってるのでこのままコピペしても動かないけれど
イメージとしてはこんな感じ。
ボタンクリックイベント{
//新しいスレッドを作成
threads = new Thread(new ParameterizedThreadStart(startThreadMain));
threads.IsBackground = true;
//スレッドで処理するqueueを引数で渡して起動
threads.Start(thqueues);
}
delegate void CloseDelegate();
private void startThreadMain(Object o) {
//スレッド内での処理をするQueue
ThreadQueue thqueue = (ThreadQueue)o;
try {
//メイン処理を行う
//MainClass.Main内でWebBrowserをNEWしてWEBから情報を取得し
//その結果をFormアプリに結果を返す
DeleMain main = new DeleMain (MainClass.Main);
//
IAsyncResult ret = this.BeginInvoke(main, new object[] { thqueue });
//登録処理が終わるまで待つ
ret.AsyncWaitHandle.WaitOne();
if (ret.IsCompleted) {
object obj = this.EndInvoke(ret);
}
//終了時の処理
//終了メッセージを画面表示
Invoke(new CloseDelegate(finish));
} catch (Exception ex) {
//エラー処理
}
}
ただ自分の実装方法が悪いのかもしれないけど1日中動かしていると2,3回処理が止まってしまうことがある。
CPU使用量もメモリ使用量もたいしたことないのになぜ。。。
目下原因を調査中(笑)
MainClass.Mainの中でもいろいろ複雑なことやってるからそっちが問題の可能性が高いので とりあえずこちら側は公開しておきます(笑)