我正在调用一个给定id的soap服务返回一个实体。每个请求只接受一个id,所以我需要多次调用Web服务来加载所有实体(10k)。
我有多个线程发出请求,他们都在并发字典中插入实体。整个过程需要几分钟,但我想不时将结果传回给来电者,让我们说每收到100个实体。
我知道我可以使用活动购买我不想为每个收到的实体发起活动。此外,如果计数器达到100,我不想检查收到的每个实体,我担心性能,因为计数器必须同步。
你会建议什么?我应该使用活动吗?还有什么吗?
答案 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个项目表现更好)。