Asp.net 这段代码是线程安全的吗? “” 如果在过去n分钟内未提交相同IP地址的提交,则“”返回true。 '' 受保护函数将MintTimeBetweenSubmissions(ByVal MintTimeBetweenRequestsMinutes作为整数)强制为布尔值 如果minTimeBetweenRequestsMinutes=0,则 返回真值 如果结束 如果缓存(“提交的请求”)为空,则 缓存(“提交的请求”)=新字典(字符串、日期) 如果结束 “删除旧请求。” Dim submittedRequests As Dictionary(字符串的,日期)=CType(缓存(“提交的请求”),Dictionary(字符串的,日期)) Dim itemsToRemove=submittedRequests.Where(函数s.值

Asp.net 这段代码是线程安全的吗? “” 如果在过去n分钟内未提交相同IP地址的提交,则“”返回true。 '' 受保护函数将MintTimeBetweenSubmissions(ByVal MintTimeBetweenRequestsMinutes作为整数)强制为布尔值 如果minTimeBetweenRequestsMinutes=0,则 返回真值 如果结束 如果缓存(“提交的请求”)为空,则 缓存(“提交的请求”)=新字典(字符串、日期) 如果结束 “删除旧请求。” Dim submittedRequests As Dictionary(字符串的,日期)=CType(缓存(“提交的请求”),Dictionary(字符串的,日期)) Dim itemsToRemove=submittedRequests.Where(函数s.值,asp.net,vb.net,Asp.net,Vb.net,否。ASP.NET缓存本身不是线程安全的,看起来您正在缓存中创建对象,具体取决于对象是否存在 写入缓存时需要锁定缓存 让我换一种说法。事实上,代码是线程安全的。但是,当前的编码方式可能会导致多线程情况下的性能问题 在这种情况下,多个用户将同时运行相同的代码,理论上是同时访问和修改相同的缓存对象。随着该场景的扩展,性能会受到影响 创建一个锁将提高重负载下的性能(同时在轻负载下增加一点开销),因为您不会因为缓存问题而不整洁地获取数据 否。ASP.NET缓存本质上不是线程安全的,并且看起来您正在缓存中

否。ASP.NET缓存本身不是线程安全的,看起来您正在缓存中创建对象,具体取决于对象是否存在

写入缓存时需要锁定缓存

让我换一种说法。事实上,代码是线程安全的。但是,当前的编码方式可能会导致多线程情况下的性能问题

在这种情况下,多个用户将同时运行相同的代码,理论上是同时访问和修改相同的缓存对象。随着该场景的扩展,性能会受到影响

创建一个锁将提高重负载下的性能(同时在轻负载下增加一点开销),因为您不会因为缓存问题而不整洁地获取数据

否。ASP.NET缓存本质上不是线程安全的,并且看起来您正在缓存中创建对象,具体取决于对象是否存在

写入缓存时需要锁定缓存

让我换一种说法。事实上,代码是线程安全的。但是,当前的编码方式可能会导致多线程情况下的性能问题

在这种情况下,多个用户将同时运行相同的代码,理论上是同时访问和修改相同的缓存对象。随着该场景的扩展,性能会受到影响


创建一个锁将提高重负载下的性能(同时在轻负载下增加一点开销),因为您不会因为缓存问题而不整洁地获取数据

根据MSDN文档,
System.Web.Caching.Cache
类是线程安全的。然而,文档还显示了一个示例,其中在缓存上执行读取和写入操作而不锁定。这不可能是线程安全的,因为写入依赖于读取。您发布的代码基本上与示例类似。我绝对建议在整个方法周围加上一个锁。

根据MSDN文档,
System.Web.Caching.Cache
类是线程安全的。然而,文档还显示了一个示例,其中在缓存上执行读取和写入操作而不锁定。这不可能是线程安全的,因为写入依赖于读取。您发布的代码基本上与示例类似。我绝对建议对整个方法进行锁定。

我不知道。如果不锁定整个方法,我可以想象一些非常奇怪的事件顺序。假设两个线程都将缓存(“提交的请求”)视为空。他们都创建了新的字典,并且正在进行将其写入缓存的竞赛。我担心可能有一个微妙的错误,导致代码错误地识别用户是否有以前提交的请求。我必须详细地追踪事情,但快速的扫视会让我产生怀疑。@Brian Gideon-这种情况可以通过双重检查(检查缓存对象在锁外是否为null,然后在锁内再次为null)轻松处理。我不知道。如果不锁定整个方法,我可以想象一些非常奇怪的事件顺序。假设两个线程都将缓存(“提交的请求”)视为空。他们都创建了新的字典,并且正在进行将其写入缓存的竞赛。我担心可能有一个微妙的错误,导致代码错误地识别用户是否有以前提交的请求。我必须详细地追踪事情,但快速的扫视会让我产生怀疑。@Brian Gideon-这种情况可以通过双重检查(检查缓存对象在锁外是否为null,然后在锁内再次为null)轻松处理。
''' <summary>
''' Returns true if a submission by the same IP address has not been submitted in the past n minutes.     
'' </summary>
Protected Function EnforceMinTimeBetweenSubmissions(ByVal minTimeBetweenRequestsMinutes  as Integer) As Boolean       
    If minTimeBetweenRequestsMinutes = 0 Then
        Return True
    End If
    If Cache("submitted-requests") Is Nothing Then            
        Cache("submitted-requests") = New Dictionary(Of String, Date)
    End If
    ' Remove old requests. '
    Dim submittedRequests As Dictionary(Of String, Date) = CType(Cache("submitted-requests"), Dictionary(Of String, Date))
    Dim itemsToRemove = submittedRequests.Where(Function(s) s.Value < Now).Select(Function(s) s.Key).ToList
    For Each key As String In itemsToRemove
        submittedRequests.Remove(key)
    Next
    If submittedRequests.ContainsKey(Request.UserHostAddress) Then
        ' User has submitted a request in the past n minutes. '
        Return False
    Else            
        submittedRequests.Add(Request.UserHostAddress, Now.AddMinutes(minTimeBetweenRequestsMinutes))
    End If
    Return True
End Function