我有以下场景:
我正在尝试锁定一个线程,如果该线程的'custom'id与已经进入已锁定部分的代码匹配,但是如果id不同则不匹配.
我创建了一些示例代码来解释我想要的行为
class A
{
private static Dictionary<int, object> _idLocks = new Dictionary<int, object>();
private static readonly object _DictionaryLock = new object();
private int _id;
private void A (int id)
{
_id = id;
}
private object getObject()
{
lock (_DictionaryLock)
{
if (!_idLocks.ContainsKey(_id))
_idLocks.Add(_id, new object());
}
lock (_idLocks[_id])
{
if (TestObject.Exists(_id))
return TestObject(_id);
else
return CreateTestObject(_id);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在这对于我扩展的内容100%工作,其中id示例1不检查是否已创建其对象,而另一个id为1的线程已经忙于创建该对象.
但是拥有两个锁和一个静态字典似乎并不是正确的做法,所以我希望有人能告诉我一个改进的方法来阻止线程访问代码只有当该线程创建时具有与一个人已经忙着执行锁定部分的代码.
我正在查看ReaderWriterLockSlim类,但对我来说,使用它并没有多大意义因为我不希望在它仍然被创建的同时读取对象TestObject(id).
我不关心锁定线程访问字典.我试图不惜一切代价避免的是该线程运行的_id不应该在内部使用,CreateTestObject(_id)而已经有一个忙,因为文件正在创建并删除该id,如果两个线程试图访问将抛出异常相同的文件
只需一个普通的锁即可修复,但在这种情况下,我仍然需要一个当前没有在该CreateTestObject(_id)方法内运行的线程能够输入锁内的代码.
这就是因为CreateTestObject内部发生的事情需要时间,如果线程正在等待访问它,性能将受到影响.
我有以下场景,我得到一个如下所示的字符串
"System.DateTime?"
Run Code Online (Sandbox Code Playgroud)
或者
"int?"
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是检索该字符串的 System.Type ,它看起来像:
{Name = "Nullable
1" FullName = "System.Nullable1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}
现在我知道如何从字符串中检索类型我可以Type.GetType("System.DateTime")在处理不可为空类型时或typeof(DateTime?)当我知道它将为 DateTime 为空时说,但在这种情况下,我不知道什么可以为空类型可能会出现并将只接收它作为字符串。
我正试图把它_valueAdds = List<ValueAddedItemHelper>变成gridItems(Dictionary),_valueAdds 因为它是Key和所有的值false.但我不知道如何用Lamda做到这一点.这到底有多远.我确实成功地使用了一个while循环但是想学习使用Lamda
gridItems = new Dictionary<ValueAddedItemHelper, bool>();
gridItems = _valueAdds.Select(k => new { k }).ToArray().ToDictionary(t => t, false);
Run Code Online (Sandbox Code Playgroud)