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

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

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

非同期で実行した関数の強制終了方法

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

■84965 / inTopicNo.1)  非同期で実行した関数の強制終了方法
  
□投稿者/ まり (1回)-(2017/08/29(Tue) 13:58:38)

分類:[ASP.NET (VB)] 

以下のような条件で作成した場合での非同期関数の強制終了方法を探しています

1.関数はSharedで宣言したいので仲介する変数をClass内には配置したくない(干渉する危険性を考えて)
2.関数は引数と戻り値を持っていて実行元で戻り値を取得したい
3.関数は一定時間後に強制終了したい

戻り値を取得するためにThreadではなくBeginInvokeにて実装しましたが非同期関数の強制終了方法がわからずに困っています
何かよい方法はないでしょうか?

Dim Result As IAsyncResult = Caller.BeginInvoke(Value, ThreadID, Nothing, Nothing)
If Result.AsyncWaitHandle.WaitOne(DefaultTimeout) Then
Ret = Caller.EndInvoke(ThreadID, Result)
Else
'スレッドの強制停止方法を考え中
End If

追記
Result.AsyncWaitHandle.Close()だとIISの実行プロセスも停止してしまいました
FrameWork 2.0にて作成しています
引用返信 編集キー/
■84966 / inTopicNo.2)  Re[1]: 非同期で実行した関数の強制終了方法
□投稿者/ WebSurfer (1288回)-(2017/08/29(Tue) 15:42:39)
No84965 (まり さん) に返信

ASP.NET で非同期処理を行う理由は、Windows Forms アプリの場合の UI の応答性の向上と
いう理由とは異なり、スループットを向上させ HTTP エラー 503 (サービス利用不可) にな
るのを防ぐということなのですが、そのあたりの認識はされてますか?

そんなことは言われなくてもわかってるということでしたら失礼しました。

でも、もし認識が曖昧ということでしたら以下を読んでください。

ASP.NET の非同期/待機の概要
https://msdn.microsoft.com/ja-jp/magazine/dn802603.aspx

「図 3 外部リソースを非同期に待機」が ASP.NET で非同期処理を行っているところです。

「外部リソース」というのは別のサーバーにある Web サービスとか DB サーバーです。外部
リソース内での処置に時間がかかるような場合が特に有効です。

非同期処理を行わない場合は一つの要求は一つのスレッドをつかんだままになりますが、非同
期処理を行うと、「外部リソース」に処理を投げた後はスレッドは即スレッドプールに戻され、
他のユーザーから来る要求に対処することができます。

Thread Pool のスレッドの数は限られているので、非同期処理を行わないとスレッドが枯渇し
やすくなります。枯渇するとキューに処理が溜まりますが、キューが満杯になると HTTP エ
ラー 503 (サービス利用不可) となってしまいます。

なお、効果があるのは「外部リソース」に処理を投げるというような I/O バウンドの処理で、
CPU バウンドの処理には効果はありません。

で、

> 3.関数は一定時間後に強制終了したい

というところですが、関数ではなく非同期ページを一定時間経ったらタイムアウトさせるとい
う方法でよければ可能なようです。

> FrameWork 2.0にて作成しています

ということですと、MSDN マガジンの March 2007 の記事「ASP.NET の非同期プログラミング
を使ったスケール変換可能なアプリケーション (Wicked Code: Scalable Apps with
Asynchronous Programming in ASP.NET)」が参考になるのではないかと思います。

日本語の Web の記事はリンク切れになってしまいましたが、英語版は .chm ファイル形式で
保存されており、以下のサイトからダウンロードできるはずです。

MSDN Magazine Issues and Downloads
https://msdn.microsoft.com/magazine/mt668395

その中のサンプルコード AsyncPageTask.aspx, AsyncPageTask.aspx.cs に具体例があります。
引用返信 編集キー/
■84982 / inTopicNo.3)  Re[2]: 非同期で実行した関数の強制終了方法
□投稿者/ まり (2回)-(2017/08/31(Thu) 12:39:32)
No84966 (WebSurfer さん) に返信

申し訳ありませんがおっしゃることの10%も理解できない状況です
他の方でどなたわかる方いらっしゃるでしょうか?
引用返信 編集キー/
■84983 / inTopicNo.4)  Re[1]: 非同期で実行した関数の強制終了方法
□投稿者/ PANG2 (188回)-(2017/08/31(Thu) 14:27:13)
No84965 (まり さん) に返信
> 以下のような条件で作成した場合での非同期関数の強制終了方法を探しています
>
> 1.関数はSharedで宣言したいので仲介する変数をClass内には配置したくない(干渉する危険性を考えて)
> 2.関数は引数と戻り値を持っていて実行元で戻り値を取得したい
> 3.関数は一定時間後に強制終了したい


戻り値や強制終了が容易なので、BackgroundWorker がよいのでは?

バックグラウンド処理を途中でキャンセルするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/437bgwcancel/bgwcancel.html
引用返信 編集キー/
■84984 / inTopicNo.5)  Re[3]: 非同期で実行した関数の強制終了方法
□投稿者/ WebSurfer (1289回)-(2017/08/31(Thu) 15:00:53)
No84982 (まり さん) に返信

> 申し訳ありませんがおっしゃることの10%も理解できない状況です

少なくとも ASP.NET で非同期処理を行う理由・意義は理解されることをお勧めします。

Windows Forms アプリのような UI 応答性の向上が頭にあって、Web サーバーからの
応答が早くなる等を期待しているとすると、それは全くの誤解で、非同期処理は意味
がありません。

それと、上にも書きましたが、I/O バウンドの処理を行っているとすると、やはり
非同期処理は意味がありません。

場合によっては意味がないどころか、Thread 切り替えのオーバーヘッドで逆効果にな
るかもしれません。

もしそうだとしたら、今の方向で進めるのは見当違い=時間と労力の無駄ということ
になってしまいますので。

引用返信 編集キー/
■84985 / inTopicNo.6)  Re[3]: 非同期で実行した関数の強制終了方法
□投稿者/ WebSurfer (1290回)-(2017/08/31(Thu) 15:04:53)
No84982 (まり さん) に返信

すみません、先のレスに間違いがありました。

誤:それと、上にも書きましたが、I/O バウンドの処理を行っているとすると、やはり
  非同期処理は意味がありません。

正:それと、上にも書きましたが、CPU バウンドの処理を行っているとすると、やはり
  非同期処理は意味がありません。

引用返信 編集キー/
■84986 / inTopicNo.7)  Re[2]: 非同期で実行した関数の強制終了方法
□投稿者/ まり (3回)-(2017/08/31(Thu) 17:00:44)
No84983 (PANG2 さん) に返信

ありがとうございます

BackgroundWorkerについて勉強しました

もしかしてCancelAsyncメソッドはDoWorkイベント内にてキャンセル処理を実装しないといけないのでしょうか?

コード内にてキャンセル処理できない部分があるのでThread.Abortのような強制終了がしたいのです
Disposeで処理が終了するのでしたらよいのですが



引用返信 編集キー/
■84989 / inTopicNo.8)  Re[3]: 非同期で実行した関数の強制終了方法
□投稿者/ 774RR (564回)-(2017/09/01(Fri) 08:46:29)
スレッドプールのスレッドを Dispose したらいろいろと全てまずいし
ASP.NET でなくて WinForms や WPF であっても Thread.Abort なんかしたら
メモリリークはしないにせよ、リソースリークはしてしまって長時間の運用に耐えられないだろう。
(特にネィティブ系ハンドルとかそういうの使っていれば)

そもそも最初の方針からいろいろ間違っている気のせいがする。要再考察。

引用返信 編集キー/
■84995 / inTopicNo.9)  Re[4]: 非同期で実行した関数の強制終了方法
□投稿者/ なちゃ (215回)-(2017/09/02(Sat) 11:33:20)
さんざん言われてますが、本当の意味での強制終了は無理と思ってください。
特にASP.NETのようなサービス系の処理では。
基本的に自分で監視するしかありません。

ここからは非同期処理そのものについて。

非同期処理の目的については、ASP.NETではスレッドプールのリソース有効活用の話が出てきやすいのですが、これに関しては余程の最大性能を発揮させる場合の話です。
超パフォーマンスチューニングをやるレベルで違いが出てくるような次元の話です。
大抵の環境ではここまでは必要ありませんし、実際きちんと効果を得るには結構前提条件などが必要です。

で、もう一つの目的として、複数サービスの呼び出しや複数の処理を実行するような場合で、レイテンシの短縮というのがあります。
質問者はどっちかというとこちらが目的に近いだろうと思われます(というかこっちの観点しか多分認識していなかったでしょう)。
この場合には、CPUバウンドの処理でも一応意味はあるのですが、当然サーバーのCPUリソースをさらに占有しますので、同時処理数が少ないなどの前提がないとうまく行きません。
他のサービス呼び出しが複数あって、待ち時間が合計になるのが困るので非同期に呼び出したい、であればよくあることで効果もあります。
引用返信 編集キー/

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


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

このトピックに書きこむ