代码之家  ›  专栏  ›  技术社区  ›  Zerowalker

如果我在整个跑步过程中都需要一次性物品,该怎么办?

  •  1
  • Zerowalker  · 技术社区  · 11 年前

    如果我在整个应用程序运行过程中都需要一次性物品,该怎么办? 在某些情况下,这似乎是必要的,例如,如果我想同步2个线程: System.Collections.Concurrent.BlockingCollection。

    如果其中一个线程使用Using并处理它,而另一个线程无法关闭或正在等待BlockingCollection(您可以设置超时),那么它将得到一个Disposed Exception。

    当这是真的时,可能会有更多的情况,那么有没有办法绕过这一点,或者我应该简单地在初始化时创建对象,然后在关闭时处理它?

    编辑:这是当我使用一次性物品时,VisualStudio告诉我的。

    首先我如何使用它,在一个例子中:

    private void Initialize()
            {
                Queue = new System.Collections.Concurrent.BlockingCollection<byte[]>();
                Queue.Dispose();
            }
    

    我明白了:

    warning : CA2213 : Microsoft.Usage : 'Capture' contains field 'Capture.Queue' that is of IDisposable type: 'BlockingCollection<byte[]>'. Change the Dispose method on 'Capture' to call Dispose or Close on this field.
    

    所以这让我很困惑。我已经告诉它在制作完成后立即处理,它仍然希望我处理它:S

    编辑2:

    这是处理在整个应用程序运行过程中应该是活动的对象的正确方法吗?

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
            Queue.Dispose();
        }
        base.Dispose(disposing);
    }
    

    正如您所看到的,我在那里添加了Queue。

    不过,这似乎并不正确,使用Designer.cs文件并在components.Dispose()下添加内容会让人感觉很奇怪;

    但希望它是正确的。

    3 回复  |  直到 11 年前
        1
  •  3
  •   Hans Passant    11 年前

    表单项目项模板给程序员带来了麻烦。他们知道您不应该编辑Designer.cs文件。但它并不是那么直截了当。打开文件并注意区域:

        #region Windows Form Designer generated code
    

    那是 你不应该搞砸的代码。请注意,Disposing(bool)覆盖是 在上面 这个地区。这意味着编辑这个就可以了。

    最好的做法是简单地将Dispose()方法从Designer.cs文件剪切/粘贴到表单的源代码文件中。现在,您可以按照分析仪的建议进行操作:

        protected override void Dispose(bool disposing) {
            if (disposing) Queue.Dispose();
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    
        2
  •  1
  •   CSJ    11 年前

    仅仅因为一个物体是一次性的,并不意味着你必须处理它!不要使用 using block:这将在对象超出范围后对其进行处理。只需正常实例化对象,并在适当的时候将其处理掉(如果您希望在应用程序的整个生命周期中使用它,则永远不要这样做)。

        3
  •  1
  •   CSJ    11 年前

    Visual Studio警告您,您的对象(一个名为 Capture )有一个可丢弃的字段。据说,当你处理表单时,你也应该处理BlockingCollection。没错。它无法知道表单被处理后您的应用程序是否会继续,所以它一直在唠叨您在处理完表单后要清理表单及其可丢弃字段。