1

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

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

并且可能有更多情况下这是真的,所以有没有办法绕过这个,或者我应该简单地在初始化时创建对象,然后在关闭时处理它?

编辑:这是我使用一次性物品时 Visual Studio 告诉我的内容。

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

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);
}

如您所见,我在那里添加了队列。

但这似乎不对,使用 Designer.cs 文件并在 components.Dispose() 下添加东西感觉很奇怪;

但希望它是正确的。

4

3 回答 3

3

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

    #region Windows Form Designer generated code

那是你不应该乱用的代码。并注意 Disposing(bool) 覆盖在该区域之上。这意味着编辑它就可以了。

最好的做法是简单地将 Designer.cs 文件中的 Dispose() 方法剪切/粘贴到表单的源代码文件中。现在您可以毫无问题地遵循分析器的建议:

    protected override void Dispose(bool disposing) {
        if (disposing) Queue.Dispose();
        if (disposing && (components != null)) {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
于 2013-08-24T13:46:50.907 回答
1

仅仅因为一个对象是一次性的,并不意味着你必须处理它!不要使用using块:这将在对象超出范围后处理它。只需正常实例化对象并在您自己的好时机处理它(或者永远不要,如果您希望在应用程序的整个生命周期中使用它)。

于 2013-08-24T13:09:27.977 回答
1

Visual Studio 警告您,您的对象(名为 的表单Capture)有一个一次性字段。就是说当你处理表单时,你也应该处理 BlockingCollection。这是正确的。它无法知道您的应用程序在表单被处理后是否会继续,因此它会在您完成后清理表单及其一次性字段。

于 2013-08-24T13:18:06.160 回答