0

マルチスレッド アパートメントの概念を理解しています。つまり、オブジェクトが 1 つのスレッドによって作成された場合、そのオブジェクトは他のすべてのスレッドで使用できます。

プロセスごとに 1 つのマルチスレッド アパートメントがあることを読みました。ASP.NET には、通常、IIS 用の W3WP.exe プロセスが 1 つあります。したがって、IIS は、あるユーザーが 1 つのセッションまたは 1 つのアプリケーションで作成したオブジェクトと、別のユーザーが別のセッションで作成したオブジェクトをどのように区別するのでしょうか? セッション オブジェクトとアプリケーション オブジェクトが使用されていると仮定しますが、不明であり、他のメカニズムがあるかどうかを知りたいです。

また、ワーカー スレッドと I/O スレッドはこの概念にどのように適合しますか? つまり、(System.Threading.Thread を使用して) 独自のスレッドを作成せず、.NET フレームワークのこれらの部分以外のサード パーティ製ライブラリを使用しないプログラムがある場合、プログラムはスレッドセーフですか?

4

2 に答える 2

0

標準の FORMS または CMD Line アプリケーションを扱う場合、明示的なスレッドを作成せず、バックグラウンド ワーカーのような別のスレッドを意味するコンポーネントを使用しないと仮定すると、通常入力するすべてのユーザー コードのプライマリ アプリケーション スレッドで操作していることになります。 . システムは、アプリケーションをサポートするためにさまざまなことを行うために他のスレッドを作成しますが、すべての集中的な目的については、スレッドセーフと見なすことができます。他のスレッドは他のコンポーネントの一部であり、競合やクロススレッドの問題なしに相互作用する安全な方法で既にコーディングされている必要があります。

あなたが指摘したように、ASP.NETではこれは異なります。IIS は、作成したオブジェクトについて、特定のページ以外は気にしません。メインスレッドは特定のリクエスト用であり、実際のメインオブジェクトは「ページ」です。ページに保存されているものはすべて、競合が実際に冷静にならないこの種の保護されたスペースにあります。セッションオブジェクトもページ固有であり、可能な限り特定のリクエストに分離されているため安全です。1 つの Page オブジェクトまたは Session オブジェクトが別のオブジェクトに公開されることは決してありませんが、ページはすべて同じアプリケーション内にあり、技術的には互いに見ることができます (明らかに非常に悪いコーディングを行う場合を除きます)。

より安全でなくなるのは、Application オブジェクトです。オブジェクトをアプリケーション スペースに保存し、それを複数のページ リクエストで使用する場合は、オブジェクトに対する操作が、並列リクエストで処理できる別のリクエストと競合する可能性がないことを確認する必要があります。この例として、アイテムの Static DataTable をアプリケーション空間に格納することが挙げられます。通常はこれを行いませんが、安全に対処する必要がある場合は、同期化オブジェクトを使用して、1 つの要求/スレッドからのコードがこのオブジェクトと重複しないようにすることです。また、アプリケーション オブジェクト/スペースは実質的に VB.Net のパブリック モジュール スペースと同じであることに注意してください。モジュールを使用して以下に例を示します...

(これは非常に単純化されすぎており、SYNCLOCKメカニズムのみを説明するためにコードで通常行うことではありません)

Public Module SharedSpace

    ' what object is used as a syncronizer is irrelavent, just needs defined only once at the start of the application.
    Public SyncDT As New Exception("none")

    Public dt As DataTable

End Module

Public Class PageItem
    Inherits System.Web.UI.Page

    Private Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

        SyncLock SyncDT
' ...
' work with "dt" ONLY inside the synclock space
' SyncLock blocks can be anywhere but they need to be as short as possible.
' Any code running in another page request will STOP trying to enter the SyncLock (for the object specified) 
' and waits until any existing SyncLock on the same object is released by exiting the SyncLock.
' ...
        End SyncLock

    End Sub

End Class

事実上、「dt」が「Synclock SyncDT」を使用したブロック内でのみアクセスされる限り、複数のスレッド間で安全です。ただし、オーバーラップが発生する可能性があるため、この方法で SyncLock なしで「dt」にアクセスすることは受け入れられません。

.NET には他にもスレッド マーシャリング オブジェクトがありますが、私の好みは Synclock です。

于 2013-04-14T23:50:55.633 に答える