.net 当任何托管线程在AppDomain中终止时,是否可以调用任意代码?
考虑一个用C#编写的类库,它在一些类上使用线程特定的字段。当线程终止时,类库需要清理数据.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) {
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中,您必须控制创建何种类型的线程,并装配手动处置资源的方法。不过,您可以尝试研究面向方面的编程。我远不是这方面的专家,但有一些框架可以让你更轻松地管理这些交叉关注点。