0

DLLImport を使用するときに同時実行性に問題があります。Web 経由で送信する必要があるレポートを提供する Dll があるので、次のようにします。

[DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall, 
CharSet = CharSet.Ansi)]
private static extern string PrintRep(several params...);

Dll 側には、レポートと共にパスを返す多くの変数とインスタンスがあります。

私が今持っているコードは PrintRep の呼び出しをロックしていますが、これは機能しますが、明らかに保留中の要求を待機させます。これをロックなしで機能させる方法はありますか? ロックを解除すると、「保護されたメモリに書き込もうとしています」というエラーがいくつか発生し、Dll が最終的にハングするためです。

4

2 に答える 2

1

レポートDLLスレッドは安全ですか?ロックを解除するとエラーが発生するとおっしゃっていたので、私はノーと推測します。したがって、DLLをスレッドセーフにする(ソースと古いdllへの変更が必要)か、または実行したDLLへの要求をシリアル化するかの2つの選択肢があります。これらはあなたの唯一の2つの選択肢です。ただし、その時点でユーザーにレポートを待たせる必要がありますか?おそらく、レポートを待っているユーザーのリストと、呼び出しに必要なパラメーターを維持してから、レポートを電子メールで送信することをユーザーに通知するWebページをユーザーに返すことができますか。次に、ユーザーに結果を待たせずに、レポートをシリアルに処理できます。

于 2009-03-16T22:12:30.930 に答える
0

すべてのWeb 要求がこの呼び出しに基づいて待機している場合は、これを別のスレッドで呼び出し、ロックを保持し、呼び出しが戻るのを待っている PrintRep 呼び出しリクエスターのみを待機させることを検討する必要があります。

PrintRep 呼び出しが完了するのを待っている人だけが待機している場合、ある種のサーバー側の作業キューを実装し、ユーザーに何らかの方法でキューに戻って確認してもらう以外に、できることはあまりありません。時限 AJAX コールバック。

何をするにしても、ThreadPool スレッドでこれを呼び出すことは避けてください。ASP.Net はこれらを使用してページ要求を処理します。

于 2009-03-16T21:55:11.957 に答える