我编写了一个 C# 库,它有一种方法可以从并行的多个文本段落中计算单词。文本段落以字符流的形式给出,每次getnextchar()
调用都有随机延迟。我的库方法必须采用这些字符流的数组并返回组合的词频计数。为此,我有一个安全共享的词频数据结构和一个线程来读取每个字符流并更新共享集合。当所有线程都完成后,我将数据结构返回给客户端应用程序。
客户端应用程序需要每 10 秒一次的组合字数统计的中间结果。为此,我使用委托每 10 秒回调一次客户端的结果,直到所有工作线程都完成,然后我将最终结果返回给客户端。
我的问题是,当我用中间结果回调客户端时,我必须锁定我的共享数据结构并等待客户端应用程序从回调中返回,然后才能解锁它。在执行回调时,所有工作线程都被阻塞,等待数据结构上的锁。这似乎不是一件明智的事情,因为我认为我不应该依赖或相信客户端代码会立即返回,甚至根本不应该返回。然而,他们唯一能想到的不依赖于客户端代码的其他方式是制作我的数据结构的副本或快照,并通过回调将其传递给客户端。这是以内存和计算为代价的,但是一旦复制完成,工作人员可以继续更新共享集合,回调可以做任何它想做的事情。
我的问题有两个:
1)这是两个弊端中较小的一个,允许错误的客户端回调实现阻止工作人员,或定期执行昂贵的操作。
2)有没有办法解决以上任何一个都不能解决的问题?