gpt4 book ai didi

c# - WCF 服务的线程安全处置

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:28 24 4
gpt4 key购买 nike

我正在尝试实现一种故障恢复机制,该机制将处理错误的 WCF 连接(然后定期尝试重新连接并重试)

本质上相关的代码就是

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

问题是上面的代码在 TPL 数据流 block 中运行并且必须是线程安全的。我在其他线程使用客户端时遇到问题。我真的想锁定整个事情,因为我会丢失并发上传并且性能会受到影响。

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

我正在按照以下(伪)代码想象一些机制

using (var counter = new ThreadCounter())
{
try
{
if (!faulted)
_client.DoSomthing();
}
catch
{
faulted = true;

counter.BlockNewThreadsEntering()

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

框架中是否有任何内容可以让我实现这一目标?或者还有其他建议吗?

最佳答案

Or any other suggestions?

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

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

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

关于c# - WCF 服务的线程安全处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com