Bra*_*ley 9 .net c# concurrency
假设我有这个方法:
void Foo(int bar)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这是我想要的行为Foo:
如果线程1调用Foo(1)和线程2调用Foo(2),则两个线程可以并发运行.
如果线程1调用Foo(1)和线程2调用Foo(1),则两个线程不能同时运行.
是否有一种良好,标准的方式.net来指定这种行为?我有一个使用对象字典锁定的解决方案,但这感觉有点混乱.
使用为不同参数提供不同锁定对象的字典.在实例化基础对象时设置字典(或静态地,如果适用):
var locks = new Dictionary<int, object>() {
{1, new Object()},
{2, new Object()},
…
};
Run Code Online (Sandbox Code Playgroud)
然后在你的方法中使用它:
void Foo(int bar) {
lock (locks[bar]) {
…
}
}
Run Code Online (Sandbox Code Playgroud)
我不会说这个解决方案很混乱,恰恰相反:提供一个精确的锁定粒度是值得称道的,因为值类型的锁在.NET中不起作用,所以有一个映射是显而易见的解决方案.
但要小心:只要不同时修改和读取字典,上述内容才有效.因此,最好在设置后将字典视为只读.
| 归档时间: |
|
| 查看次数: |
2242 次 |
| 最近记录: |