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

C# 如果我在整个跑步过程中都需要一次性物品,该怎么办?,c#,multithreading,dispose,C#,Multithreading,Dispose,如果在整个应用程序运行过程中需要一次性物品,该怎么办? 在某些情况下,这似乎是必要的,例如,如果我想与以下两个线程同步: System.Collections.Concurrent.BlockingCollection 如果一个线程使用Using并处理它,而另一个线程无法关闭或正在等待BlockingCollection,则可以设置超时,然后它将获得一个已处理的异常 如果这是真的,可能会有更多的情况,那么有没有办法绕过这一点,或者我应该在初始化时创建对象,然后在关闭时处理它 编辑:下面是Visu

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

如果一个线程使用Using并处理它,而另一个线程无法关闭或正在等待BlockingCollection,则可以设置超时,然后它将获得一个已处理的异常

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

编辑:下面是VisualStudio在我使用一次性物品时告诉我的

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

private void Initialize()
        {
            Queue = new System.Collections.Concurrent.BlockingCollection<byte[]>();
            Queue.Dispose();
        }
如您所见,我在那里添加了队列

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


但希望它是正确的。

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

仅仅因为对象是一次性的,并不意味着您必须处置它!不要使用using块:这将在对象超出范围后处理该对象。如果您希望在应用程序的整个生命周期中使用该对象,只需正常实例化该对象,并在您自己的适当时间将其处理掉即可。

Visual Studio警告您,称为“捕获”的表单中的对象有一个可一次性使用的字段。也就是说,在处理表单时,还应该处理BlockingCollection。没错。它无法知道在处理表单后应用程序是否会继续,因此在处理完表单及其可处置字段后,它会提醒您清理表单及其可处置字段。

Visual Studio警告您,称为“捕获”的表单对象有一个可处置字段。也就是说,在处理表单时,还应该处理BlockingCollection。没错。它无法知道在处理完表单后应用程序是否会继续,因此在处理完表单及其可处理字段后,它一直在困扰您清理表单及其可处理字段。

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

    #region Windows Form Designer generated code
这是你不应该弄乱的代码。请注意,Disposingbool覆盖位于该区域上方。也就是说,编辑这个就可以了

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

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

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

    #region Windows Form Designer generated code
这是你不应该弄乱的代码。请注意,Disposingbool覆盖位于该区域上方。也就是说,编辑这个就可以了

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

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

不要在对象上使用using,并在程序启动时对其进行初始化,在程序关闭时进行处置。问题是你不能保证其他人不会在对象上使用吗?问题是,我应该这样做吗?VisualStudio讨厌我在使用中不处理对象,它说你需要处理一次性对象,即使我让它在近距离处理对象。所以我很困惑为什么要在初始化块中立即处理它?这仅仅是为了测试VS中的警告消息吗?@crush是的,只是为了测试它。我没有在那里使用它。你使用这个初始化方法只是为了初始化你所有的类成员吗?为什么不在构造函数或类声明private BlockingCollection Queue=new BlockingCollection中这样做;不要在对象上使用using,并在程序启动时对其进行初始化,在程序关闭时进行处置。问题是你不能保证其他人不会在对象上使用吗?问题是,我应该这样做吗?VisualStudio讨厌我在使用中不处理对象,它说你需要处理一次性对象,即使我让它在近距离处理对象。所以我很困惑为什么要在初始化块中立即处理它?这仅仅是为了测试VS中的警告消息吗?@crush是的,只是为了测试它。我没有在那里使用它。你使用这个初始化方法只是为了初始化你所有的类成员吗?你为什么不在医院里做那件事

e构造函数或类声明中的private BlockingCollection队列=new BlockingCollection;好吧,这很好:不过,要在开始时创建它,我应该在哪里做呢,因为有很多地方,我应该在上、窗体加载、初始化时还是在私有的myDisposableobject=new myDisposableobject?对一次性对象的主要引用保存在哪里?该引用位于顶部,作为类中的私有变量。您应始终在保存对该对象的主要引用的同一类中处理该对象。在析构函数或类的Dispose方法中。是否有其他类持有对同一队列实例的引用?我就是这么做的。或者,我不知道析构函数,但是如果你检查我的问题,我想我添加了dispose方法。没有,我没有在任何地方使用过这个参考资料。有趣的事实是,如果我使用var Queue=new blablabla,那么如果我事后处理它,它不会抱怨。但是如果我在类中使用引用,它会抱怨。啊,很高兴听到这个消息:但是,要在开始时创建它,我应该在哪里做呢,因为有很多地方,我应该在上、FormLoad、初始化时还是在私有的myDisposableobject=new myDisposableobject?对一次性对象的主要引用保存在哪里?该引用位于顶部,作为类中的私有变量。您应始终在保存对该对象的主要引用的同一类中处理该对象。在析构函数或类的Dispose方法中。是否有其他类持有对同一队列实例的引用?我就是这么做的。或者,我不知道析构函数,但是如果你检查我的问题,我想我添加了dispose方法。没有,我没有在任何地方使用过这个参考资料。有趣的事实是,如果我使用var Queue=new blablabla,那么如果我事后处理它,它不会抱怨。但是如果我在课堂上使用引用,它会抱怨。但是我该如何清理它呢?。我正在处理这个物体,但它仍然没有得到它。我这样做有什么问题吗?不要把对象放在实例化的地方,它几乎会立即停止使用。相反,在表单的dispose方法中处理对象。如果还没有,请添加一个。所以我需要将其放入Designer.cs代码中?因为据我所见,我想这就是处置方法。我想是的。当心设计师在你身上重新编写这个函数!最好将Dispose方法提升到您自己的代码中,即将其从Capture.Designer.cs代码中取出并放在Capture.cs中。通过将此一次性对象BlockingCollection声明为另一个一次性对象窗体的字段,您将使该窗体成为该集合的管理员。如果表单被关闭、关闭、处置,那么确保其拥有的对象也被正确处置是有意义的。如果您觉得这有点可疑,那么在您的应用程序中,可能不适合将窗体设置为集合的所有者,并且集合应该在窗体之外进行管理。但是如何清理它呢?。我正在处理这个物体,但它仍然没有得到它。我这样做有什么问题吗?不要把对象放在实例化的地方,它几乎会立即停止使用。相反,在表单的dispose方法中处理对象。如果还没有,请添加一个。所以我需要将其放入Designer.cs代码中?因为据我所见,我想这就是处置方法。我想是的。当心设计师在你身上重新编写这个函数!最好将Dispose方法提升到您自己的代码中,即将其从Capture.Designer.cs代码中取出并放在Capture.cs中。通过将此一次性对象BlockingCollection声明为另一个一次性对象窗体的字段,您将使该窗体成为该集合的管理员。如果表单被关闭、关闭、处置,那么确保其拥有的对象也被正确处置是有意义的。如果您觉得这有点可疑,那么在您的应用程序中,可能不适合将窗体设置为集合的所有者,并且集合应该在窗体之外进行管理。谢谢,这与其他答案相同,但它解释得更多一些:与表单订阅自己的FormClosed或Disposed方法相比,这样做的优点或缺点是什么?谢谢,这是与其他方法相同的答案,但它解释得更多一些:与表单订阅自己的FormClosed或Disposed方法相比,这样做的优点或缺点是什么?