我有一个包含工作线程的对象.我想在对象超出范围时杀死线程.
using System.IO;
using System;
using System.Threading;
namespace tt {
class Program
{
static void Main()
{
AnotherClass a = new AnotherClass();
a.Say();
}
}
class AnotherClass:IDisposable {
private bool m_Disposed;
private readonly AutoResetEvent m_ResetEvent = new AutoResetEvent(false);
public AnotherClass() {
Thread t = new Thread(wait);
t.Start();
}
public void Dispose() {
Dispose(true);
}
private void Dispose(bool disposing) {
if (m_Disposed) {
return;
}
if (disposing) {
Console.WriteLine("inner disposing");
}
m_ResetEvent.Set();
Console.WriteLine("Outer disposing");
m_Disposed = true;
}
private void wait() {
m_ResetEvent.WaitOne();
}
~AnotherClass() {
Dispose(false);
}
public void Say() {
Console.WriteLine("HellO");
}
}
}
Run Code Online (Sandbox Code Playgroud)
该程序将挂在那里,因为没有调用AnotherClass的析构函数.我知道我可以调用a.Dispose()来杀死线程.但有没有办法在对象超出范围时隐式杀死线程?
不,那是不可能的.没有引用计数可以注意到该对象没有更多引用,因此在发生这种情况时无法执行任何操作.
该IDisposable接口用于在不再使用实例时需要执行某些操作的类,并且调用该Dispose方法是您发信号通知该实例的方式.
在离开作用域时确保放置对象的常用方法是将代码包装在using块中:
static void Main()
{
using (AnotherClass a = new AnotherClass())
{
a.Say();
}
}
Run Code Online (Sandbox Code Playgroud)
该using块是块的语法糖try...finally:
static void Main()
{
AnotherClass a = new AnotherClass();
try
{
a.Say();
}
finally
{
if (a != null)
{
((Idisposable)a).Dispose();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1367 次 |
| 最近记录: |