c# - 处理传递给线程的对象的正确方法是什么?
问题描述
给定以下代码:
ThreadWork thrdwrk = new ThreadWork();
Thread t = new Thread(() => thrdwrk.do_work(inc_client));
t.Start();
确保thrdwrk
调用处置方法的正确程序或最佳实践是什么?thrdwrk
实现 iDisposable。
如果其中包含的任何对象thrdwrk
都不是线程安全的 - 这会阻止它还是导致问题?
我无法找到任何文档来具体说明在这种情况下的流程是什么。
解决方案
为了防止过早处置的问题,经验法则是一次性物品应该由创建它们的人处置。将创建/处理对象的责任分配给两个不同的参与者是违反直觉的。
暂时忘记线程,一般的想法是:
ThreadWork thrdwrk = new ThreadWork();
doSomeThings(thrdwrk);
thrdwrk.Dispose();
这里的using
模式会更好:
using(ThreadWork thrdwrk = new ThreadWork())
{
doSomeThings(thrdwrk);
}
但是,您的特定案例的螺纹性质使得很难确定何时可以真正处置该物体。这是基于周围环境的更细微的考虑,从您的问题中不清楚。
理想情况下,您遵守经验法则。等到线程完成,然后你就知道你可以安全地处理对象了。
或者,如果您确信对象应该由线程处理并且不想实现逻辑以等待线程完成,那么您应该保持一致并让线程也创建自己的一次性对象。
我认为在其唯一目的是将其传递到较低范围的范围内创建对象没有任何好处。
推荐阅读
- php - Codes work well on live server but not working on localhost. Giving errors
- javascript - 在标签中时不出现 SVG 圆圈
- pandas - Pandas 连接并合并两个数据框
- angular - ng serve 命令导致错误“找不到名称'describe'(或'beforeEach'、'it'、'expect'等)”
- angularjs - Blueimp Lightbox gallery angular
- haskell - 在 Haskell 中为复合类型定义一个实例
- ansible - 如何将远程主机的键=值对文件读入 Ansible 中的变量?
- php - Save a model with multiple relationships with dynamically added childrens
- c# - MassTransit 消费者的 XUnit 单元测试
- android - Mapbox Android SDK 使用的 CarmenFeature 是什么?