- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为 Job 的简单类,它有一个公共(public) ctor 和一个名为 Run() 的公共(public)函数。
Run() 将做一些工作,包括向 3rd 方供应商提出请求,费用为 $$$。在发出请求之前,它首先检查 SQL Server DB 以查看数据是否已经存在。发出请求后,它将数据放入数据库中。
这是一个带有 .NET WCF Windows 服务后端的 ASP.NET 前端。该请求通过 WCF 调用传入,我将合约设为 InstanceContextMode.Singleton。对于那些不熟悉 WCF 的人 - 这只是意味着我的契约(Contract)将排队任何请求,直到当前请求完成。在这里,我只是创建了一个 Job 类的实例,将来自用户的输入参数发送到 ctor 中,然后调用 Run() 函数。
这很好用,因为它是一个单例 WCF 服务,它可以阻止重复的请求发送到供应商并花费不需要花费的 $$。这些作业运行得足够快,因此一次只运行一项作业就可以了。
但是,这对我来说仍然有点臭。作业类完全独立于 WCF 服务和任何调用者,如果我愿意,应该可以重用。
我怎样才能使工作类,“自线程安全”可以这么说?我的意思是 - 它现在的设计方式,作业类的调用者必须确保他不会同时运行两个作业,以免创建不必要的欺骗请求。
有没有办法在作业类本身内部使用纯线程锁定来做到这一点?因此,如果我的类(class)的用户创建了 2 个 Job 类的实例并分离出 2 个调用 Run() 的线程,它会将第二个人排入队列,直到第一个完成? (或任何数量的电话)。我不能只为整个 Run 函数使用 Lock(),因为就像我刚刚给出的示例一样,它们只会将 Run 调用旋转到单独的线程中,从而使 Lock 无用。我认为我在这里缺少一些明显而简单的东西......??
注意 - 让它跨过程“自我管理”并不是我关心的。我担心在多个线程中使用我的 Job 类的同一进程。对于前者,我只是将“检查数据库/调用供应商/插入数据库”放入单独的服务中。
谢谢
编辑:感谢戴夫的回答。这是证明它有效的代码:只需删除 SyncLock 行即可查看它的工作情况。 (对不起,我们在工作中使用VB =P)
Public Class ThreadTest
Private Shared syncObj As New Object()
Private id As String
Public Sub New(ByVal id As String)
Me.id = id
End Sub
Public Sub Run()
'remove this line to see the output change
SyncLock syncObj
For i As Integer = 0 To 1000
Console.Write(id)
Next
End SyncLock
End Sub
End Class
Module Module1
Sub Main()
Dim tt As New ThreadTest("1")
Dim tt2 As New ThreadTest("2")
Dim thread1 As New Threading.Thread(AddressOf tt.Run)
Dim thread2 As New Threading.Thread(AddressOf tt2.Run)
thread1.Start()
thread2.Start()
Threading.Thread.Sleep(Threading.Timeout.Infinite)
End Sub
End Module
最佳答案
这取决于您的应用程序的结构,但您可能能够避免锁定 Job
中的私有(private)静态对象变量。类(class)。
private static readonly object lockObject = new object();
public void Run()
{
lock (lockObject)
{
// Do a bunch of stuff here.
}
}
关于.net - 这个类的更好的线程模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883843/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!