- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用并发字典来保存打开的文件。
要打开一个新文件,我这样做:
myDictionary.GetOrAdd (fName, (fn) => new StreamWriter(fn, true));
有了这个,我经常会遇到以下异常:
System.IO.IOException: The process cannot access the file '....' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPa
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
at System.IO.StreamWriter..ctor(String path, Boolean append)
对我来说,这意味着该操作不是原子操作,并且该软件正在尝试打开同一个文件两次。
有没有其他我可以使用的原子操作?出于性能考虑,我想避免锁定。
最佳答案
因为正如 Ameen 指出的那样,保证键/值对只会添加一次,您可以持有 ConcurrentDictionary<string, Lazy<StreamWriter>>
, 值工厂应该构造 Lazy<StreamWriter>
通过传递 LazyThreadSafetyMode.ExecutionAndPublication
参数(第二个参数,在实例化委托(delegate)之后)。这样,您就可以限制每个文件的锁定,而无需锁定整个字典。
private static ConcurrentDictionary<string, Lazy<StreamWriter>> _myDictionary =
new ConcurrentDictionary<string, Lazy<StreamWriter>>();
public static StreamWriter GetOrCreate(string fName)
{
return _myDictionary.GetOrAdd(fName,
new Lazy<StreamWriter>(() => new StreamWriter(fName),
LazyThreadSafetyMode.ExecutionAndPublication)).Value;
}
关于c# - ConcurrentDictionary 的 GetOrAdd 不是原子的。除了锁定还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21867842/
下面哪两段代码在不同情况下表现更好,为什么? 1。 private readonly ConcurrentDictionary> _coll; _coll.GetOrAdd(1, new List()
我想将 GetOrAdd 之类的东西与 ConcurrentDictionary 一起用作网络服务的缓存。这本词典有异步版本吗? GetOrAdd 将使用 HttpClient 发出 Web 请求,因
我正在使用 ConcurrentDictionary 来缓存并行访问的数据,有时新项目可以存储在数据库中,但它们不会加载到缓存中。这就是我使用 GetOrAdd 的原因 public User Get
ConcurrentDictionary.GetOrAdd(TKey, Func)接受工厂函数以允许将项目的延迟实例化放入字典中。 定义一个本身调用 GetOrAdd() 的工厂函数是否安全,即在“父
这个问题在这里已经有了答案: Async call within synchronous function (1 个回答) 关闭 5 年前。 我正在考虑使用 ConcurrentDictionary
我有几个使用 ConcurrentDictionary 的案例用于缓存值,但通常我需要执行值验证以决定是否使用 ConcurrentDictionary.GetOrAdd(TKey, Func) 将其
我正在使用并发字典的 GetOrAdd 方法来检索值列表,然后引用我正在编辑的值列表。这样做是线程安全的吗? 第一种方法是添加一个值,第二种方法是清除列表。 using System.Collecti
考虑这段代码: void DoSomething(int key) { concurrentDictionary.GetOrAdd(key, (k)=> {
问题:我需要实现对象缓存。缓存需要是线程安全的并且需要按需填充值(延迟加载)。这些值是通过 Key 的 Web 服务检索的(操作缓慢)。所以我决定使用 ConcurrentDictionary 及其
我有一个 ConcurrentDictionary: private static ConcurrentDictionary _cd = new ConcurrentDictionary(); 保守地
我试图通过为一些非常核心的功能引入缓存层来减轻我的数据库服务器的工作,这些功能将值插入数据库中的表并检索 ID。这是在多线程环境中。 我的第一个方法是: public class Cache {
我正在使用并发字典来保存打开的文件。 要打开一个新文件,我这样做: myDictionary.GetOrAdd (fName, (fn) => new StreamWriter(fn, true));
我注意到 GetOrAdd() 总是执行工厂委托(delegate),即使值存在于字典中也是如此。例如: class Program { private static ConcurrentDi
The bottom of this article描述了使用 GetOrAdd 如何导致(如果我理解正确的话)损坏/意外结果。 剪断/ ConcurrentDictionary is designe
我将并发字典用作线程安全的静态缓存并注意到以下行为: 来自 the MSDN docs on GetOrAdd : If you call GetOrAdd simultaneously on dif
在.NET Framework 中,有Dictionary 和ConcurrentDictionary。这些方法提供了Add、Remove 等方法... 我知道当我们设计一个多线程程序时,我们使用Co
ConcurrentDictionary 的文档没有明确说明,所以我想我们不能期望委托(delegate) valueFactory 和 updateValueFactory 同步执行(分别来自 Ge
我是一名优秀的程序员,十分优秀!