【问题标题】:Using NDepend, how can we removed Cycle Dependencies generated by the compiler due to Tasks (TPL) from the Dependency Matrix?使用 NDepend,我们如何从依赖矩阵中删除由于任务(TPL)而由编译器生成的循环依赖?
【发布时间】:2013-05-11 17:19:37
【问题描述】:

使用 NDepend,我们如何从依赖矩阵中删除由于任务 (TPL) 而由编译器生成的循环依赖。

如果我们不能删除它们,那么我们如何轻松地将它们与需要我们注意的重要循环依赖区分开来。

在处理编译器生成的循环依赖方面是否有任何最佳实践?

编辑:

编译器生成的依赖循环可以在图的左上角观察到

生成依赖循环的代码(在 .Net 4.0 中编译)

*logger 是我班级中的一个字段

  private void WriteJsonFileToDiskAsync(string filePath, string json)
    {
        Task.Factory.StartNew(() => WriteJsonFileToDisk(filePath, json))
            .ContinueWith(HandleWriteException);
    }

    private void WriteJsonFileToDisk(string filePath, string json)
    {
        Stream fileStream = null;
        try
        {
            fileStream = File.Create(filePath);
            using (var writer = new StreamWriter(fileStream))
            {
                fileStream = null;
                writer.Write(json);
            }

            logger.InfoIfDebuggerIsAttached(string.Format(CultureInfo.InvariantCulture, "Persisted file: {0}", filePath));
        }
        finally
        {
            if (fileStream != null)
                fileStream.Dispose();
        }
    }

    private static void HandleWriteException(Task task)
    {
        if (task.IsFaulted)
        {
            //TODO: Handle Exception
        }
    }

【问题讨论】:

  • 您的问题需要通过您所谓的编译器因任务 (TPL) 生成的循环依赖项 的示例来细化。需要示例的 .NET Reflector 屏幕截图 + 对应 NDepend 依赖矩阵的第二个屏幕截图才能获得明确的答案。
  • 感谢您的回答,我将尝试复制并发布屏幕截图。
  • Patrick,我添加了更多信息。这是否足以帮助我对可能出现的问题有所了解?

标签: c# task-parallel-library ndepend


【解决方案1】:

Alexandre,编译你的源代码后,我得到了如下依赖矩阵:

我们可以看到编译器从你那里生成了一个在Program 中声明的子类型。这个生成的类型,名为Program+<>c__DisplayClass1 只是编译器体操,它不是源代码的一部分。这不是问题,这两种类型相互依赖,您无能为力。

要丢弃生成的类型,您可以编写如下查询...

from t in Application.Types
where !t.IsGeneratedByCompiler
select t

...然后将部分结果导出到Matrix:

最后,我想补充一点,在一般情况下,相互依赖的类型不是问题。大多数知名的GoF design patterns 都需要相互依赖的类型。

问题在于当您有相互依赖的组件时,尤其是当这些组件是命名空间时。 NDepend 网站上公开有关于此主题的 two white-books

类型相互依赖的问题之一是基类使用派生类时(有一个默认的 CQLinq 规则 Base class should not use derivatives

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多