我正在尝试编写一个无锁的单链表.最终的一致性不是问题(有人遍历可能包含不正确项目的列表).
我认为我得到了正确的添加项目(循环和Interlocked.CompareExchange).
但我无法弄清楚如何删除节点(列表中的任何位置),因为我必须得到前一个项目并将它们的Next字段设置为当前节点Next字段.
class Node
{
Node Next;
object Value;
}
class SinglyLinkedList
{
Root _root;
public void Add(object value)
{}
public void Remove(object value)
{}
}
Run Code Online (Sandbox Code Playgroud)
即
a - > b - > c
至
a - > c
伪代码:
Node prev;
Node node = _root;
while (node.Value != nodeValue)
{
prev = node;
node = node.Next;
}
prev.Next = node.Next;
Run Code Online (Sandbox Code Playgroud)
我如何使这成为一个原子操作(即确保prev.Next = node.Next调用没有next或prev被另一个线程删除)?
我可以使用ReaderWriterLockSlim,但我发现这个问题很有趣,因为我知道存在无锁链表.
我的担忧:
如果当前线程在循环和赋值之间挂起,则会发生以下情况:
prev 本身可能已被另一个线程删除. …如何在不首先从数据库中提取对象的情况下删除对象?
在另一个ORM中,我可以这样做:
session.Delete<User>(1); // 1 = PK
Run Code Online (Sandbox Code Playgroud) 我是一名VB.Net开发人员,在C#中有点新手,在查看C#文档时,我通过迭代器和生成器来了,无法完全理解使用,我有任何人可以解释(在vb中有洞察力;如果可能的话)
当我写 @(line.Quantity * line.Product.Price).ToString("c")的结果是
39,00.ToString("c")
Run Code Online (Sandbox Code Playgroud)
而@line.Quantity * line.Product.Price.ToString("c")结果是
2 * line.Product.Price.ToString("c")
Run Code Online (Sandbox Code Playgroud)
如何在剃刀视图中将两个值相乘并将其转换为字符串?
我有一个编译为64位的ADO.NET驱动程序.因此,我需要在64位模式下运行mstests.那可能吗?
(开发机器是64位).
有没有办法将合同放在.NET中自动实现的属性上?(如果答案是'是'怎么办?)?
(我假设使用DevLabs的.NET代码合同)
我正在创建一个我正在进行性能测试的库.在其中我生成Dictionary<Type, X>一次.这些项目目前以随机顺序插入.字典在应用程序生命周期内保持不变.
然后它经常用于查找项目.查找是库中较大的瓶颈之一.
是的,我是微观优化,但要学习.我想知道是否有更好的方法来获得查找性能?
更新
我用dotTrace来衡量性能.报告+ dotTrace在我的家用电脑中,所以我这里没有报告(否则可能会将其上传到其他地方).
我使用了这里的测试:https: //github.com/danielpalme/IocPerformance
字典定义可在此处找到:https://github.com/jgauffin/Griffin.Container/blob/master/Source/Griffin.Container/ContainerBase.cs
(我上个星期五创建了容器,不要期望太多)
UPDATE2

Dictionary.TryGetValueResolve如果我正确地解释数字,则需要总共101ms (总共251ms),这是40.2%.
我一直在阅读很多关于javascript中"继承"的文章.其中一些使用,new而其他人推荐Object.Create.我读的越多,我就越困惑,因为它似乎存在无穷无尽的变体来解决继承问题.
有人可以向我展示最受欢迎的方式(如果有的话,还是事实上的标准)?
(我想有一个基础物体Model,我可以延伸RestModel或LocalStorageModel).
我熟悉多播等等.
使用了两个主要示例:
使用Socket与Bind()
UDPClient.JoinMulticastNetwork()
一个指定一个LeaveMulticastGroup和另一个绑定和Joining没有LeaveMulticastGroup()
两种多播方法有什么区别,哪种方法更适合使用?
我是新来的信号r,我正在尝试在c#visual studio 2012中创建一个基本的聊天应用程序,但我收到了以下错误.
The following errors occurred while attempting to load the app.
- No assembly found containing an OwinStartupAttribute.
- The discovered startup type 'SignalRTutorials.Startup, SignalRTutorials, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
conflicts with the type 'Microsoft.VisualStudio.Web.PageInspector.Runtime.Startup, Microsoft.VisualStudio.Web.PageInspector.Runtime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
Remove or rename one of the types, or reference the desired type directly.
To disable OWIN startup discovery, add the appSetting owin:AutomaticAppStartup with a value of "false" in your web.config.
To specify the OWIN startup Assembly, Class, or Method, add the …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×2
64-bit ×1
asp.net-mvc ×1
dictionary ×1
enumerators ×1
generator ×1
iterator ×1
javascript ×1
lock-free ×1
mstest ×1
multicast ×1
nhibernate ×1
owin ×1
performance ×1
properties ×1
razor ×1
signalr ×1
sockets ×1