如何减少生成的事件数量

时间:2015-01-14 17:14:28

标签: c# .net multithreading events

我正在调用一个给定id的soap服务返回一个实体。每个请求只接受一个id,所以我需要多次调用Web服务来加载所有实体(10k)。

我有多个线程发出请求,他们都在并发字典中插入实体。整个过程需要几分钟,但我想不时将结果传回给来电者,让我们说每收到100个实体。

我知道我可以使用活动购买我不想为每个收到的实体发起活动。此外,如果计数器达到100,我不想检查收到的每个实体,我担心性能,因为计数器必须同步。

你会建议什么?我应该使用活动吗?还有什么吗?

2 个答案:

答案 0 :(得分:2)

如果你有能力“批量”你的线程,那么这可能会有效。

使用Task代替Thread,然后批量创建这些内容。最后,使用Task.WaitAll

// Construct started tasks
Task[] tasks = new Task[100];
for (int i = 0; i < 100; i++)
{
    //action is your method as a delegate
    tasks[i] = Task.Factory.StartNew(action);
}

Task.WaitAll(tasks);
FireHundredComplete(); //Invoke your event

现在,您需要在单独的线程/任务上运行每个那些,因为Task.WaitAll将阻止(并且它不是异步的,因此您不能{{1} }它)。

你也会有很多这些事件以看似随机的间隔开始,因为每组任务都可以随时完成。同步很容易成为一个问题。

答案 1 :(得分:2)

  

此外,如果计数器达到100,我不想检查收到的每个实体,我担心性能,因为计数器必须同步。

不要;在同步块中递增计数器疯狂快速;锁实际上非常便宜,所以简单的实现可能很简单:

bool raiseEvent;
lock(sharedLock) {
    raiseEvent = (++counter % EventFrequency) == 0;
}
if(raiseEvent) {...}

但是,您可以使用互锁更高效地

if((Interlocked.Increment(ref counter) % EventFrequency) == 0)
{ ... }

然而!这似乎意味着真正的&#34;表现&#34;这里的问题是进行大量的网络服务电话。我强烈建议制作更多批次式。这并不是必要的意思,而是一批中的所有东西,而是100个批次的100个项目将比10,000个单独的呼叫表现更好(并且通常也会比1批10,000个项目表现更好)。