gpt4 book ai didi

.net - 这个类的更好的线程模型?

转载 作者:行者123 更新时间:2023-12-03 13:22:30 27 4
gpt4 key购买 nike

我有一个名为 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com