首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asp.net全局同步时钟对象

asp.net全局同步时钟对象
EN

Stack Overflow用户
提问于 2011-02-07 10:59:14
回答 2查看 1.8K关注 0票数 0

在asp.net中是否有一种方法可以确保某个线程子程序不会同时运行两次,不管是什么情况?

我现在的代码是

代码语言:javascript
复制
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函数简单地将消息写入表。

表中的消息应该一次又一次地按顺序出现(输入、退出、退出),但在现实中,它们不是。

这意味着同步时钟不完整。这是真的吗?

如果是这样,我们如何在代码块、跨请求和跨会话上实现完整的同步时钟?

编辑:我需要这个锁,因为根据数据库中的邮件类型列表,真正的代码将发送电子邮件。在发送每个邮件类型后,将其标记,然后继续进行下一次邮件。我不能在处理过程中,另一个线程应该将此邮件视为未处理的。

请告知

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-07 12:29:45

您考虑过使用静态变量而不是使用HttpRuntime缓存吗?

正如一条注释(解释为什么你想要这个功能),如果你的网站一次只能运行一次,你的网站就不会有很大的可伸缩性。

票数 2
EN

Stack Overflow用户

发布于 2011-02-07 14:55:51

在C# (对不起,不知道VB语法)中,我使用以下方法:

代码语言:javascript
复制
private static readonly object Padlock = new object();

它是一个字段,而不是属性,它是静态的(在VB中,如果我没有弄错的话,这是“共享的”),所以在整个application

  • It's中,一旦使用这个类就初始化一次,而不是当您显式地使用该字段时,它是相同的。

使用属性/缓存版本,可以有两个线程试图获取锁对象,每个线程创建一个不同的线程:

线程1检查缓存,没有找到object

  • Thread 1是parked

  • Thread 2检查缓存,找不到object

  • Thread 2创建并缓存对象,再次检索并从property

  • Thread 1 resumes

  • Thread 1返回创建新对象并缓存它,再次检索并返回与线程2使用

  • 时不同的锁对象--任何其他线程都将使用线程1

的锁对象

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4920481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档