我有几个按钮,用户可以点击以使用jQuery的$ .ajax加载内容.所有按钮都将内容加载到相同的div标签中.问题是,如果用户快速点击多次,内容可能会在登陆正确的内容之前闪烁几次.
我有什么解决方法?我在想类似.net的SyncLock功能,但在javascript/jQuery中.理想的解决方案是取消队列中当前的请求并启动新的请求.
需要注意的一点是,可能存在多个不相关的ajax请求,因此我无法清除所有请求,只是与这个div标签相关的请求.
假设我有两个对象a和b.
我想在两个对象上使用SyncLock.
这可行吗?它可以通过嵌套的SyncLock语句完成吗?这种手术有哪些危险?
编辑
也许我应该问,一个重构怎么能避免死锁?
我对一般的多线程很新,我想知道如何锁定共享整数变量,以便其他线程在被其他线程读取/更新时不被其他线程访问.
当我尝试这样做时SyncLock myInteger,我得到了错误:错误6'SyncLock'操作数不能是'Integer'类型,因为'Integer'不是引用类型.
这是我的意思的简化示例
Private Shared myInteger As Integer
Private Sub MySub()
SyncLock myInteger ' This does not work
' read/write a new value to myInteger
End SyncLock
End Sub
Run Code Online (Sandbox Code Playgroud)
MySub由该类的多个实例调用,并在多个线程中运行
我有一个类,其中包含多线程应用程序中使用的List(of T).我有三种方法Get,Add和Remove这些访问和修改List(of T).每当我查询所需对象以及添加或删除对象时,我都在使用SyncLock来锁定m_List. 但是,当我添加一个对象或删除一个对象而不是在我搜索所需的对象时,我只是想通过简单地锁定m_List来获得性能提升是多么奇怪?
Public Shared sub Add(SomeObject as object)
SyncLock ctype(m_List, IList).SyncRoot
m_List.add(SomeObject)
end SyncLock
end sub
Public Shared sub Remove(SearchString as string)
SyncLock ctype(m_List, IList).SyncRoot
m_List.RemoveAll(function(o as SomeObject) o.SomeProperty = SearchString)
end SyncLock
end Function
Public Shared Function Get(SearchString as string) as SomeObject
'The Commented out code is what I am thinking of removing...
'SyncLock ctype(m_List, IList).SyncRoot
Dim FoundObjectList = m_List.where(function(o as SomeObject) o.SomeProperty = SearchString)
if FoundObjectList.count > 0 then
If FoundObjectList(0).CreateDate < Now.AddMinutes(5) then
Remove(FoundObjectList(0).SomeProperty)
Return …Run Code Online (Sandbox Code Playgroud) 我有一个类,其中有两个方法,一个调用一个创建并执行多个线程的类,另一个是一个事件处理程序,它处理在这些线程完成时引发的事件(然后再次调用第一个方法).
我知道处理事件的方法在引发事件的线程中运行.因此,我SyncLock一个成员变量,说明正在运行多少个线程并从中减去一个:
SyncLock Me ' GetType(me)
_availableThreads -= 1
End SyncLock
Run Code Online (Sandbox Code Playgroud)
所以我有几个问题:
主要问题:我是否应该在类中的任何地方使用SyncLock'ing _availableThreads - 即在创建线程的方法中(在创建线程时添加1)
与此问题相关的附带问题:
我通常会同步SyncLock当前的实例,但我已经看到了SyncLocks类型的代码,那么同步锁定SyncLock(Current Instance)和_availableThreads?之间的区别是什么?
这两者之间会有性能差异吗?并且有什么小的我可以锁定以上不影响其他任何东西 - 可能是一个单独的'挂锁'对象创建的唯一目的是锁定类中的东西?
注意:_available线程的唯一目的是控制在任何给定时间可以运行的线程数,并且线程处理可能需要数小时才能运行的作业.
码:
Public Class QManager
Private _maxThreadCount, _availableThreads As Integer
Public Sub New(ByVal maxThreadCount As Integer)
Me.MaximumThreadCount = maxThreadCount
End Sub
Public Sub WorkThroughQueue()
//get jobs from queue (priorities change, so call this every time)
Dim jobQ As Queue(Of QdJobInfo) = QueueDAO.GetJobList
//loop job queue while there are jobs and we have threads …Run Code Online (Sandbox Code Playgroud) 基本上我有一个全局变量,比如......
Dim int1 as integer
Run Code Online (Sandbox Code Playgroud)
然后我有两个异步函数,比如...
function bleh()
int1 += 1
end function
Run Code Online (Sandbox Code Playgroud)
和
function Meh()
int1 -= 1
end function
Run Code Online (Sandbox Code Playgroud)
这两个函数都由Task.Run()运行.
我想在这两个函数中使用SyncLock.但是,MSDN站点上给出的所有示例仅显示在单个函数中使用的SyncLock的示例.所以我不能简单地从MSDN描述中告诉我,对于我来说,在全局变量上跨两个不同的函数使用SyncLock是"没问题的".
我想做的是这样的:
Private Shared SyncObj as Object '<-- global
Dim int1 as integer '<-- global
Sub Form_Load(...)
SyncObj = new Object
Task.Run(Function() bleh())
Task.Run(Function() Meh())
End Sub
Function bleh()
SyncLock SyncObj
int1 += 1
End SyncLock
End Function
Function Meh()
SyncLock SyncObj
int1 -= 1
End SyncLock
End Function
Run Code Online (Sandbox Code Playgroud)
这可以吗?将bleh()阻止Meh()改变int1,反之亦然?谢谢!对不起VB大声笑.