.net 当任何托管线程在AppDomain中终止时,是否可以调用任意代码?

.net 当任何托管线程在AppDomain中终止时,是否可以调用任意代码?,.net,multithreading,c#-4.0,.net,Multithreading,C# 4.0,考虑一个用C#编写的类库,它在一些类上使用线程特定的字段。当线程终止时,类库需要清理数据 namespace MySdk { public class MyClass { [ThreadStatic] private static SomeData _data; public static SomeData Data { get { if(_data == null) {

考虑一个用C#编写的类库,它在一些类上使用线程特定的字段。当线程终止时,类库需要清理数据

namespace MySdk
{
  public class MyClass
  {
    [ThreadStatic]
    private static SomeData _data; 

    public static SomeData Data
    {
       get
       {
         if(_data == null)
         {
           _data = new SomeData();
         }
         return _data;
       }
    }

    public static void FreeSomeData()
    {
      // Release _data 
    }

    // some other useful data which uses _data

  }  
} 
当托管线程在当前AppDomain中终止时,是否有方法调用FreeSomeData?由于使用该类库的应用程序的复杂性,在线程结束之前显式调用该方法可能是不切实际的。由于存在间接层,启动线程的代码甚至可能不知道该类库的存在

在本机代码中,我会在中执行此操作,并检查
DLL\u THREAD\u DETACH
fdreason


非常感谢。

一些数据应该有一个可以清理资源的终结器


如果您需要确定性清理,那么没有一个简单的解决方案。分析API可能会被滥用以提供您所需的内容,但是让
SomeData
实现
IDisposable
并将责任推给客户机会容易得多。

一个选项是创建一个最低限度的线程类来包装System.Threading.thread类。您可以创建自己的Thread对象,而不是创建System.Threading.Thread对象,该对象执行完全相同的操作,但在线程完成时调用FreeSomeData()

例如:

class MyThread
{
    private Action _worker;

    public MyThread(Action worker)
    {
        _worker = worker;
    }

    public void Start()
    {
        var t = new System.Threading.Thread(doWork);
        t.Start();
    }

    private void doWork()
    {
        _worker();
        MyClass.FreeSomeData();
    }
}

谢谢,我用这个方法将所有的资源管理打包在一个一次性的facade类中。间接级别意味着我不负责线程的创建。例如,这些类可以由计时器或ASP.NET创建的线程使用。我认为在.Net中,您必须控制创建何种类型的线程,并装配手动处置资源的方法。不过,您可以尝试研究面向方面的编程。我远不是这方面的专家,但有一些框架可以让你更轻松地管理这些交叉关注点。