c# - 我的 Windows 服务实例需要一个贡献函数

标签 c# sql .net function

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

相关文章:

c# - 多任务调度导致死锁

c# - 如何使用 Razor 单选按钮正确实现 MVC3?

c# - NHibernate 存储过程返回先前查询的数据

sql - 选择每年的 TOP 记录

.net - `x <> Nothing` 与 `x IsNot Nothing`

javascript - 将字节数组从代码后面发送到 ajax 调用

c# - 使用 Oracle 时如何使用 Fluent NHibernate 实现批量抓取?

c# - 如何摆脱子元素中的空命名空间 "xmlns="""?

SQL Server - 查找与特定值匹配的最后一行

c# .NET - 标签页边距