在C#中同步共享资源的集合

朱利安·戈尔德(Julian Gold)

我的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 );
            }
        }
    }

假设我无法将处理器重写为无状态的(这是一个选择,但由于重构量大,它将是最后的选择),是否有更好的方法来表达这一点?

y

如果您真的不想更改处理器,那么我会做一个包装器。

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有关更多信息DataFlowTPLhttp://msdn.microsoft.com/en-us/library/hh194684.aspx的信息特定于ActionBlock<T>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#中同步共享资源的集合

来自分类Dev

优化对共享资源的访问同步

来自分类Dev

具有共享资源的观察者模式中的 C# 竞争条件预防

来自分类Dev

将线程同步责任转移到共享资源中

来自分类Dev

函数式编程中的共享资源

来自分类Dev

函数式编程中的共享资源

来自分类Dev

Java 并发 API 锁与共享资源上的同步

来自分类Dev

对象的共享资源

来自分类Dev

共享资源的基于锁的同步方法中的所有权是什么意思?

来自分类Dev

.Net Core 3.1和Razor页面中的共享资源

来自分类Dev

在多线程程序中更新共享资源

来自分类Dev

尝试从共享资源中打印偶数和奇数

来自分类Dev

在项目之间共享资源

来自分类Dev

Docker如何共享资源

来自分类Dev

修改同步方法后,所有Java线程都会看到共享资源更新吗?

来自分类Dev

修改同步方法后,所有Java线程都会看到共享资源更新吗?

来自分类Dev

@Synchronized似乎无法同步访问共享资源以进行对Spring Webserver的异步调用

来自分类Dev

WebGL共享资源Web Worker

来自分类Dev

跨部门的Project Server共享资源

来自分类Dev

使用共享资源创建多个线程

来自分类Dev

线程:共享资源特殊情况

来自分类Dev

Rails 中部分的共享资源

来自分类Dev

在容器组之间共享资源限制

来自分类Dev

在Java中的源代码和测试之间共享资源的推荐方法是什么?

来自分类Dev

如何在Android中的单元测试和仪器测试之间共享资源?

来自分类Dev

Apache Beam:在实例中的所有线程之间共享资源

来自分类Dev

PIXI.js加载程序共享资源纹理检测名称中的拼写错误

来自分类Dev

在1个解决方案中的多个项目之间共享资源。Visual Studio 2010

来自分类Dev

避免在Linux中为共享资源切换应用程序[进程]

Related 相关文章

  1. 1

    在C#中同步共享资源的集合

  2. 2

    优化对共享资源的访问同步

  3. 3

    具有共享资源的观察者模式中的 C# 竞争条件预防

  4. 4

    将线程同步责任转移到共享资源中

  5. 5

    函数式编程中的共享资源

  6. 6

    函数式编程中的共享资源

  7. 7

    Java 并发 API 锁与共享资源上的同步

  8. 8

    对象的共享资源

  9. 9

    共享资源的基于锁的同步方法中的所有权是什么意思?

  10. 10

    .Net Core 3.1和Razor页面中的共享资源

  11. 11

    在多线程程序中更新共享资源

  12. 12

    尝试从共享资源中打印偶数和奇数

  13. 13

    在项目之间共享资源

  14. 14

    Docker如何共享资源

  15. 15

    修改同步方法后,所有Java线程都会看到共享资源更新吗?

  16. 16

    修改同步方法后,所有Java线程都会看到共享资源更新吗?

  17. 17

    @Synchronized似乎无法同步访问共享资源以进行对Spring Webserver的异步调用

  18. 18

    WebGL共享资源Web Worker

  19. 19

    跨部门的Project Server共享资源

  20. 20

    使用共享资源创建多个线程

  21. 21

    线程:共享资源特殊情况

  22. 22

    Rails 中部分的共享资源

  23. 23

    在容器组之间共享资源限制

  24. 24

    在Java中的源代码和测试之间共享资源的推荐方法是什么?

  25. 25

    如何在Android中的单元测试和仪器测试之间共享资源?

  26. 26

    Apache Beam:在实例中的所有线程之间共享资源

  27. 27

    PIXI.js加载程序共享资源纹理检测名称中的拼写错误

  28. 28

    在1个解决方案中的多个项目之间共享资源。Visual Studio 2010

  29. 29

    避免在Linux中为共享资源切换应用程序[进程]

热门标签

归档