在asp.net中是否有一种方法可以确保某个线程子程序不会同时运行两次,不管是什么情况?
我现在的代码是
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函数简单地将消息写入表。
表中的消息应该一次又一次地按顺序出现(输入、退出、退出),但在现实中,它们不是。
这意味着同步时钟不完整。这是真的吗?
如果是这样,我们如何在代码块、跨请求和跨会话上实现完整的同步时钟?
编辑:我需要这个锁,因为根据数据库中的邮件类型列表,真正的代码将发送电子邮件。在发送每个邮件类型后,将其标记,然后继续进行下一次邮件。我不能在处理过程中,另一个线程应该将此邮件视为未处理的。
请告知
发布于 2011-02-07 12:29:45
您考虑过使用静态变量而不是使用HttpRuntime缓存吗?
正如一条注释(解释为什么你想要这个功能),如果你的网站一次只能运行一次,你的网站就不会有很大的可伸缩性。
发布于 2011-02-07 14:55:51
在C# (对不起,不知道VB语法)中,我使用以下方法:
private static readonly object Padlock = new object();它是一个字段,而不是属性,它是静态的(在VB中,如果我没有弄错的话,这是“共享的”),所以在整个application
使用属性/缓存版本,可以有两个线程试图获取锁对象,每个线程创建一个不同的线程:
线程1检查缓存,没有找到object
的锁对象
https://stackoverflow.com/questions/4920481
复制相似问题