2009-03-16 23 views
0
にDLLIMPORTを使用しているとき、私は並行処理でいくつかの問題を抱えている

は、私がWeb上で送信する必要があるいくつかのレポートを提供してDLLを持っているので、私はこれがあります。P /呼び出し[DLLIMPORT] ASP.NET

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

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

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

答えて

1

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

0

すべて Web要求は、この呼び出しに基づいて待っている場合は、呼び出しが待機するように戻るのを待って、別のスレッドでこれを呼び出してロックを維持する、とだけPrintRepコール要求者にすることを検討すべきです。

PrintRepの呼び出しが完了するのを待っている人だけが待機している場合は、サーバー側の作業キューを実装していなくても何もできませんおそらくタイムドAJAXコールバックによって呼び出されます。

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

関連する問題