c# - 如果我在整个运行过程中都需要一次性用品怎么办?

标签 c# multithreading dispose

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

如果然后一个线程使用 Using 并释放它,而另一个线程无法关闭或正在等待 BlockingCollection(您可以设置超时),它将得到一个 Disposed Exception。

而且可能有更多的情况是这样的,那么有没有办法绕过这个,或者我应该简单地在初始化时创建对象,然后在关闭时处理它?<​​/p>

编辑:这是我使用一次性元素时 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() 下添加内容感觉很奇怪;

但希望它是正确的。

最佳答案

Form 项目项模板给程序员带来了麻烦。他们知道您不应该编辑 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);
    }

关于c# - 如果我在整个运行过程中都需要一次性用品怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18418644/

相关文章:

c++ - pthread_exit 与 posix 线程中的返回

c++ - 双重锁定解决方法

.net - 明确的控制措施不会将其处置-有什么风险?

c# - 完成与处置

c# - 从 Windows Phone 7 访问 WiFi 信息

c# - 使用 RegEx 读取 CSV 文件

c# - 如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容

c# - 使用 JSON.NET 将动态 JSON 字符串解析为 C# 中的字符串

java - onClickListener 没有被第二次调用 Android

java - Dispose() 不适用于每一帧