我的C#应用程序中有一个静态的共享资源(文本处理器类)集合,这些集合会响应关键字。每个处理器都是有状态的,因此不能在多线程上下文中工作。我正在寻找一种组织这些的好方法,以便可以对它们进行线程安全的访问。
例如,我可以在每个处理器中嵌入一个同步对象
public abstract class TextProcessor
{
protected internal readonly object sync = new object();
public abstract void Run( string text );
}
public class DocumentProcessor
{
private static Dictionary<string,TextProcessor> s_procMap = ...;
public void Run( string [] words1, string[] words2 )
{
ThreadPool.QueueUserWorkItem( Process, words1 );
ThreadPool.QueueUserWorkItem( Process, words2 );
}
private void Process( object arg )
{
foreach( var word in words )
{
var proc = s_processor[word];
lock( proc.sync )
{
proc.Run( word );
}
}
}
假设我无法将处理器重写为无状态的(这是一个选择,但由于重构量大,这将是最后的选择),是否有更好的方法来表达这一点?
如果您真的不想更改处理器,那么我会做一个包装器。
public class ProcWrapper
{
private TextProcessor _proc;
private ActionBlock<string> _actBlock;
public ProcWrapper(TextProcessor proc)
{
_proc = proc;
_actBlock = new ActionBlock<string[]>(word=>
{
_proc.Run(word);
});
}
public void AddWord(string words)
{
_actBlock.Post(word);
}
public void WaitForCompletion()
{
_actBlock.Completion.Wait();
}
}
并像以前一样使用它:
Dictionary<string,ProcWrapper> s_procMap = ...;
void Run( string [] words )
{
// NOTE: This assumes the same thread will access s_procMap.
foreach(var word in words)
s_procMap[word].AddWord(word);
}
我认为这很接近您要寻找的东西。
看看http://msdn.microsoft.com/en-us/library/hh228603.aspx有关更多信息DataFlow
以TPL
及http://msdn.microsoft.com/en-us/library/hh194684.aspx的信息特定于ActionBlock<T>
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句