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

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

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

Re[1]: イベントの発生確認


(過去ログ 63 を表示中)

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

■36443 / inTopicNo.1)  イベントの発生確認
  
□投稿者/ モー (1回)-(2009/05/29(Fri) 01:56:39)

分類:[VB6 以前] 

現在、クラサバ系システムでクライアントからのアクセスに対して、サーバがVB6のDLL(ActiveX)で通信(受信)処理を
し、VB.NETアプリにイベント通知をするようなシステムを構築しております。DLLは通信処理、解析のみです。

通常のアクセス頻度では問題ないのですが、サーバへのアクセスを集中(高負荷)にすると、まれにアプリにイベントが
起きずにDLL内で正常終了してしまい、アプリ処理ができないことがあります。

イベント発生には、DLL内でRaiseEventを用い、アプリではDLLのイベントハンドラを用いております。

ログを見る限り、DLL内のRaiseEvent部は処理していると思われます。

システム構成としては
 各クライアント毎に専用のポートと同内容のアプリ(VB.NET)を用意し、各アプリがそれぞれDLL(VB6)を参照している
 構成になっています。


(質問)
 RaiseEventは集中アクセスすると、イベントが発生しないことがあるのでしょうか?
 (アプリ、DLLのどちらに問題があるか分かっておりません。)
 
 また、RaiseEventによりイベントが起きたかどうかを呼び出し側(DLL)から把握する方法(メソッド)は
 あるのでしょうか?RaiseEventは非同期処理になるのでしょうか?
 



ご教授お願いします。


引用返信 編集キー/
■36444 / inTopicNo.2)  Re[1]: イベントの発生確認
□投稿者/ 魔界の仮面弁士 (1106回)-(2009/05/29(Fri) 02:16:38)
No36443 (モー さん) に返信
>  RaiseEventは集中アクセスすると、イベントが発生しないことがあるのでしょうか?
あるのかも知れませんが、分かりません(私は経験した事がありません)。


>  また、RaiseEventによりイベントが起きたかどうかを呼び出し側(DLL)から把握する方法(メソッド)は
イベント引数に ByRef Boolean なパラメータを付与しておき、
 f = False
 RaiseEvent FooEvent(f)
 If f = True Then
  '処理された
 End If
という判断にするのはどうでしょうか。イベントの利用側が、
 Sub obj_FooEvent(ByRef f As Boolean)
  f = True
 End Sub
として、イベントを処理したことを伝える必要がありますけれども…。
引用返信 編集キー/
■36469 / inTopicNo.3)  Re[1]: イベントの発生確認
□投稿者/ たくボン (166回)-(2009/05/29(Fri) 12:43:25)
No36443 (モー さん) に返信
> 現在、クラサバ系システムでクライアントからのアクセスに対して、サーバがVB6のDLL(ActiveX)で通信(受信)処理を
> し、VB.NETアプリにイベント通知をするようなシステムを構築しております。DLLは通信処理、解析のみです。
> 通常のアクセス頻度では問題ないのですが、サーバへのアクセスを集中(高負荷)にすると、まれにアプリにイベントが
> 起きずにDLL内で正常終了してしまい、アプリ処理ができないことがあります。
>
> システム構成としては
>  各クライアント毎に専用のポートと同内容のアプリ(VB.NET)を用意し、各アプリがそれぞれDLL(VB6)を参照している
>  構成になっています。
>
> (質問)
>  RaiseEventは集中アクセスすると、イベントが発生しないことがあるのでしょうか?
>  (アプリ、DLLのどちらに問題があるか分かっておりません。)

.NETのクライアントはWindowsアプリ?ASP?
関係ないと思うけど、こんな資料もあった。

http://support.microsoft.com/kb/201014/ja

ここに書いてる通りだとアパートメントスレッドで作成されていても、COMの側でSTAに偽装されるらしいからブロッキングが発生してるのかも。
まずは現象の再現が特定できる環境を作ってパフォーマンスモニタやSPYを使って、シングルスレッドで呼び出しされているか、マルチかを特定してから次の問題解決に進むのが良いのかも。

>  また、RaiseEventによりイベントが起きたかどうかを呼び出し側(DLL)から把握する方法(メソッド)は
>  あるのでしょうか?RaiseEventは非同期処理になるのでしょうか?

VB6側のActiveXの作りがどうなっているかわからないけど、Instancingプロパティやスレッドモデルが関係してくるからこれは個々の設定を確認するのが良いかも。
イベントの成否判断は魔界の仮面弁士さんが書いた方法で良いと思います。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -