首页 > 解决方案 > 处理传递给线程的对象的正确方法是什么?

问题描述

给定以下代码:

ThreadWork thrdwrk = new ThreadWork();

Thread t = new Thread(() => thrdwrk.do_work(inc_client));
t.Start();      

确保thrdwrk调用处置方法的正确程序或最佳实践是什么?thrdwrk实现 iDisposable。

如果其中包含的任何对象thrdwrk都不是线程安全的 - 这会阻止它还是导致问题?

我无法找到任何文档来具体说明在这种情况下的流程是什么。

标签: c#.netmultithreading

解决方案


为了防止过早处置的问题,经验法则是一次性物品应该由创建它们的人处置。将创建/处理对象的责任分配给两个不同的参与者是违反直觉的。

暂时忘记线程,一般的想法是:

ThreadWork thrdwrk = new ThreadWork();

doSomeThings(thrdwrk);

thrdwrk.Dispose();

这里的using模式会更好:

using(ThreadWork thrdwrk = new ThreadWork())
{
    doSomeThings(thrdwrk);
}

但是,您的特定案例的螺纹性质使得很难确定何时可以真正处置该物体。这是基于周围环境的更细微的考虑,从您的问题中不清楚。

理想情况下,您遵守经验法则。等到线程完成,然后你就知道你可以安全地处理对象了。

或者,如果您确信对象应该由线程处理并且不想实现逻辑以等待线程完成,那么您应该保持一致并让线程也创建自己的一次性对象。
我认为在其唯一目的是将其传递到较低范围的范围内创建对象没有任何好处。


推荐阅读