0

同じライブラリのさまざまなクラスで使用されるthreadstatic変数を使用するライブラリを作成しました。スレッド用に初期化されると、これらすべてのクラスが連携して、これらの変数を使用してタスクを実行します。

ここで、ASP.NETアプリケーションでこれと同じライブラリを使用する必要があります。threadstaticでは変数が単一のスレッドに対してグローバルになることはありませんが、これらはスレッド間で共有されることがわかりました。

良いアプローチに聞こえないので、関数に変数を渡すことは避けています。したがって、ライブラリを両方のタイプのアプリケーション(winforms + webforms)で使用できるようにするためのソリューション、つまり、threadstaticとsessionの代替が必要です。

図書館の辞書を使って自分の管理を実装してみませんか?誰が私(ライブラリ)、つまりデスクトップアプリケーションまたはasp.netを呼び出したのかを知り、その後、スレッドIDまたはセッションIDをそれぞれ使用して、辞書から変数を取得します。今のところ、それが可能かどうかはわかりません。

また、ASP.NETによるスレッド共有によってthreadstaticが誤動作するのを防ぐために、IISではなくexeによってホストされるこのライブラリ用にWebサービスが作成された場合はどうなりますか?

解決策を提案してください。

4

1 に答える 1

0

そして、threadstatic は単一のスレッドに対して変数をグローバルにしないことを知りましたが、これらはスレッド間で共有されます

問題は、それらがスレッド間で共有されることではなく、リクエスト間で共有されることです。ASP.NET では、スレッドは要求間で共有され、複数のスレッドで要求を処理することもできます (ただし、これが発生する場所/状況は限られていると思います)。

良いアプローチとは思えないため、変数を関数に渡すことは避けています。

なぜこれが悪いアプローチだと思うのかわかりません-ThreadStaticを使用するよりもはるかに良いように聞こえます:)

図書館の辞書を使って独自の管理を実装してみませんか?誰が私(ライブラリ)、つまりデスクトップアプリケーションまたはasp.netを呼び出したのかを知り、その後、それぞれスレッドIDまたはセッションIDを使用して辞書から変数を取得します。今のところ、それが可能かどうかはわかりません。

これは、データの受け渡しを避けるために大変な作業のように思えますが、可能なはずです。HttpContext.Itemsリクエストごとに存在するキャッシュであるや を使用するなど、これを少し簡単にするための組み込みクラスがいくつかあるかもしれませんがCallContext、コードがどのように使用されているかによって異なります。

于 2011-03-06T13:46:28.373 に答える