小编Kas*_*bæk的帖子

使用SyntaxNode.ReplaceNode替换同一树中的多个节点

我目前正在使用Roslyn在语法树上进行三向合并.我在一个ClassDeclerationSyntax节点上的所有子节点之间匹配,并且想要对子节点执行合并,然后基于该合并创建新树.

O是输入ClassDeclerationSyntax,匹配有三个类型的成员(A,O,B)MemberDeclerationSyntax.

var updated = O;
foreach (var m in matching)
{
    if (m.A != null && m.B != null && m.O != null) {
        var merge = Merge(m.A, m.O, m.B);
        var oldUpdated = updated;
        updated = updated.ReplaceNode(m.O, merge);
    }
    else if (m.A == null && m.O == null && m.B != null)
        updated = updated.AddMembers(m.B);
    else if (m.A != null && m.O == null && m.B == null)
        updated = updated.AddMembers(m.A);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.在第二次迭代中, …

c# roslyn

6
推荐指数
1
解决办法
963
查看次数

当valueFactory有副作用时,ConcurrentDictionary.GetOrAdd

我试图通过为一些非常核心的函数引入缓存层来从我的数据库服务器卸载工作,这些函数将值插入数据库中的表并检索id.这是一个多线程环境.

我的第一个方法是:

public class Cache {
      private Dictionary<string, Int64> i;

      public void Init() { /* init i with values from DB */ }

      public Int64 Get(string value)
         lock(i) {
            Int64 id;
            if (cache.i.TryGetValue(value, out id))
                return id;

            id = /* Insert to DB and retrieve ID */
            cache.i[value] = id;
            return id;
      }
 }
Run Code Online (Sandbox Code Playgroud)

这有帮助.然而,线程仍然相互等待很多.我想减少这个等待时间.我的第一个想法是使用ConcurrentDictionary.GetOrAdd(key, valueFactory).这不起作用,因为可以多次调用valueFactory.

我已经结束了这种方法:

public class Cache
{
    private ConcurrentDictionary<string, Int64> i;

    public void Init() { /* init i with values from DB */ } …
Run Code Online (Sandbox Code Playgroud)

c# database concurrency multithreading concurrentdictionary

3
推荐指数
1
解决办法
3006
查看次数