线程安全处理WCF服务

时间:2014-11-24 12:49:44

标签: c# multithreading wcf concurrency tpl-dataflow

我'尝试实现故障恢复机制,该机制将在出错时配置WCF连接(然后定期尝试重新连接并重试)

基本上相关的代码只是

try
{
    _client.DoSomthing();
}
catch
{
    _client.Dispose();
}

问题是上面的代码在TPL数据流块内部运行,并且必须是线程安全的。我在客户端被其他线程使用时遇到问题。我真的想要锁定整个事情,因为我失去了并发上传和性能受损。

我正在寻找某种方法来阻止使用客户端的新线程,但在我知道任何当前调用完成之前不会尝试处理。然后确保只有一个线程执行dispose。

我沿着以下(伪)代码

的线路成像某种机制
using (var counter = new ThreadCounter())
{
    try
    {
        if (!faulted)
            _client.DoSomthing();
    }
    catch
    {
        faulted = true;

        counter.BlockNewThreadsEntering() 

        if (counter == 1)
             _client.Dispose();
    }
}

框架中是否有任何东西可以让我实现这一目标?还是其他任何建议?

1 个答案:

答案 0 :(得分:2)

  

或其他任何建议?

只需遵循“一个线程 - 一个客户端”规则。没有理由在线程之间共享数据库连接,http客户端,服务客户端等。

通常,所有这些对象都处于微小状态,并且通过共享来最小化资源使用的任何努力都是令人头疼的,因为您需要同步跨线程访问以防止对象的状态被破坏。

如果您的代码在创建新线程时考虑系统资源(因此,不会在4个CPU内核上创建100个线程),则每个线程一个服务客户端不是问题。