我有一个以 Guid
作为主键的表。该表已经包含很多行。另外,我有一个 win 服务
,它对每一行执行一组操作(可能需要从另一个数据库读取和写入数据)。所以一行的处理需要相当多的时间。 (平均约 100 秒)
我的 win 服务是这样工作的:
public class MyDto
{
public Guid Id { get; set; }
}
while (true){
if(time to start){
List<MyDto> rows = LoadData();
foreach(MyDto obj in rows){
Process(obj);//it takes in average about 100 sec
}
}
}
我需要减少所有行的执行时间。由于某些原因,我决定增加 win 服务的实例。所以我需要每个 win 服务都处理自己的行集。
我已经参数化了我的 LoadData()
乐趣:
public List<MyDto> LoadData(int winServInstanceNumber){
}
所以我需要一个贡献函数,该函数取决于获胜服务实例总数和创建获胜服务实例数。
你能提供比
更好的东西吗//on .net side
obj.Id.GetHashCode()%totalWinServiceInstancesCount
或
--on sql side
HASHBYTES('MD5', CAST(id as varbinary(16)))%totalWinServiceInstancesCount
最佳答案
看起来您只需要旋转更多线程来处理您的数据。但是要做到这一点,您需要控制您处理的内容,以免重复处理同一件事。要获得控件,您可以使用 MSMQ
,例如,或 System.Collections.Queue
。您的服务应负责查询数据库并将未处理的行加载到您的队列中。
然后,您可以调用一些静态方法ProcessBatch
。它将进入队列并旋转一个线程,并将行的 id 传递给处理器/ worker 。 worker 只会处理一行。 worker可以是独立的EXE和运行进程。您的“ProcessBatch”应该控制处理/未处理的内容。它应该控制当前运行的线程数。你不想旋转太多。
所以
Service ProcessControl Worker
| | |
|---Load Queue | |
| | | |
|<--------| | |
| | |
|-----Call When Q ----->|---Queue |
| | | |
| |<------| |
| | |
|---Load Queue |----Start------>|
| | |<---Success-----|
|<-------| | |
| |---Permanent |
|-----Call When Q ----->| Dequeue |
| | | |
| |<------| |
这可能是典型的工作负载拆分,可以加速原本缓慢的进程
关于c# - 我的 Windows 服务实例需要一个贡献函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178316/