Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并发线程无法访问WCF ConcurrentDictionary中的数据_C#_.net_Wcf_Concurrency - Fatal编程技术网

C# 并发线程无法访问WCF ConcurrentDictionary中的数据

C# 并发线程无法访问WCF ConcurrentDictionary中的数据,c#,.net,wcf,concurrency,C#,.net,Wcf,Concurrency,我在IIS上托管的WCF服务中面临多个线程的问题 该服务是在并发模式设置为“多个”和实例上下文模式设置为“每个会话”的情况下实现的 内存中维护有一个静态ConcurrentDictionary,用于存储发送给传入客户端的会话令牌 问题是,有时线程只是找不到存储在此字典中的密钥,因此拒绝传入的请求 我已验证流中没有未处理的异常。日志语句表明,当一个线程在另一个线程执行读取操作时写入字典,就会出现问题。使用Visual Studio进行调试时,此问题不会重现 我正在探索如何利用探查器工具来跟踪运行时

我在IIS上托管的WCF服务中面临多个线程的问题

  • 该服务是在并发模式设置为“多个”和实例上下文模式设置为“每个会话”的情况下实现的
  • 内存中维护有一个静态ConcurrentDictionary,用于存储发送给传入客户端的会话令牌
  • 问题是,有时线程只是找不到存储在此字典中的密钥,因此拒绝传入的请求

    我已验证流中没有未处理的异常。日志语句表明,当一个线程在另一个线程执行读取操作时写入字典,就会出现问题。使用Visual Studio进行调试时,此问题不会重现


    我正在探索如何利用探查器工具来跟踪运行时行为。请建议是否有另一种方法可以准确地确定数据在该字典中是如何变得不可用的。

    我在“多”/“PerCall”场景中使用了ConcurrentDictionary,但到目前为止没有遇到任何并发读/写问题

    您是否有从ConcurrentDictionary中删除项的代码?在那里放一个日志,检查它是否没有被调用。获取错误后检查ConcurrentDictionary项计数


    我想您已经考虑过其他可能性,例如您确保在首次访问之前添加密钥,或者您的服务主机(IIS)在此期间没有重新启动。

    我假设您的
    ConcurrentDictionary
    是静态的?问题是IIS应用程序池将被回收,而您的字典将被吹走!如果你能提供一个数据库,那就太棒了。@TheGeneral:是的,concurrentDictionary是静态的。我没有为应用程序池回收指定任何值,我认为默认值是29小时。虽然问题是随机出现的,但肯定是在用户登录后一个小时左右。您可以在字典的方法中设置断点,这应该会起作用。@hoodaticus:当我设置断点时,我无法重现问题。是的,在访问它们之前肯定会添加键。我已使用日志语句对此进行了验证。所以,有一段代码可以从字典中删除条目,我发现在问题开始发生之前,它不会被调用。处理删除数据的那段代码按其应有的方式调用。