我'尝试实现故障恢复机制,该机制将在出错时配置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();
}
}
框架中是否有任何东西可以让我实现这一目标?还是其他任何建议?
答案 0 :(得分:2)
或其他任何建议?
只需遵循“一个线程 - 一个客户端”规则。没有理由在线程之间共享数据库连接,http客户端,服务客户端等。
通常,所有这些对象都处于微小状态,并且通过共享来最小化资源使用的任何努力都是令人头疼的,因为您需要同步跨线程访问以防止对象的状态被破坏。
如果您的代码在创建新线程时考虑系统资源(因此,不会在4个CPU内核上创建100个线程),则每个线程一个服务客户端不是问题。