0

asp.netに、特定のスレッド化されたサブが何があっても同時に2回実行されないようにする方法はありますか?

私が今持っているコードは

Public Class CheckClass
ReadOnly Property CheckSessionsLock As Object
    Get
        If HttpRuntime.Cache("CheckSessionsLock") Is Nothing Then HttpRuntime.Cache("CheckSessionsLock") = New Object
        Return HttpRuntime.Cache("CheckSessionsLock")
    End Get
End Property
Sub TryThreads()
    Dim thread = New Thread(AddressOf TryLock)
    thread.Priority = ThreadPriority.Lowest
    thread.Start()
End Sub
Sub TryLock()
    SyncLock CheckSessionsLock
        DoTrace("entered locker")
        For x = 0 To 10000
        Next
        DoTrace("exiting locker")
    End SyncLock
    DoTrace("exited locker")
End Sub
End Class

このコードをすべてのページで実行すると、コードが数回重複します。コード内のDoTrace関数は、メッセージをテーブルに書き込むだけです。

表内のメッセージは、順番に(入力、終了、終了)何度も表示されるはずですが、実際には表示されません。私は入った、出た、入った、出た、出たようになります...

これは、同期ロックが完了していないことを意味します。本当?

もしそうなら、リクエスト間およびセッション間で、コードのブロックに完全な同期ロックを実装するにはどうすればよいですか?

編集:データベース内のメールタイプのリストによると、実際のコードは電子メールを送信するため、このロックが必要です。各メーリングタイプが送信された後、マークが付けられ、次のメーリングに進みます。処理の途中ではできません。別のスレッドがこのメールを未処理と見なす必要があります。

お知らせ下さい

4

2 に答える 2

2

HttpRuntimeキャッシュを使用するのではなく、静的変数の使用を検討しましたか?

注(この機能が必要な理由を説明すると役立つ場合があります)と同様に、一度に1回しか実行できない場合、Webサイトはあまりスケーラブルになりません。

于 2011-02-07T12:29:45.693 に答える
1

C#では(申し訳ありませんが、VB構文がわかりません)これを使用します:

private static readonly object Padlock = new object();
  • これはフィールドであり、プロパティではありません。
  • これは静的であるため(VBでは、誤解しない限り「共有」されます)、アプリケーション全体で同じです。
  • フィールドを明示的に使用するときではなく、このクラスを使用するとすぐに初期化されます。

プロパティ/キャッシュバージョンでは、2つのスレッドがロックオブジェクトを取得しようとし、それぞれが異なるスレッドを作成する可能性があります。

  • スレッド1はキャッシュをチェックし、オブジェクトを見つけられません
  • スレッド1は駐車されています
  • スレッド2はキャッシュをチェックし、オブジェクトを見つけられません
  • スレッド2はオブジェクトを作成してキャッシュし、再度取得してプロパティから返します。
  • スレッド1が再開します
  • スレッド1は、新しいオブジェクトを作成してキャッシュし、再度取得して、スレッド2が使用するものとは異なるロックオブジェクトを返します。
  • それ以降のスレッドは、スレッド1のロックオブジェクトを使用します。
于 2011-02-07T14:55:51.440 に答える