Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 干净地关闭DLL';在主机I don';t控制_C#_Static_Constructor_Garbage Collection_Finalizer - Fatal编程技术网

C# 干净地关闭DLL';在主机I don';t控制

C# 干净地关闭DLL';在主机I don';t控制,c#,static,constructor,garbage-collection,finalizer,C#,Static,Constructor,Garbage Collection,Finalizer,当我的DLL由我不控制的代码托管时,下面的psuedo代码是否实现了我的清理目标 更具体地说,如何清理在静态构造函数中创建的对象 我是否需要在一次性文件中取消定稿 我是否保证即使主机没有调用IDisposable,编译器或其他东西也会调用IDisposable Psuedo代码: public class MyDLL : SomeHostICantControl, IDisposable { public SpinLock MyDictionarySpinlock = new Sp

当我的DLL由我不控制的代码托管时,下面的psuedo代码是否实现了我的清理目标

  • 更具体地说,如何清理在静态构造函数中创建的对象

  • 我是否需要在一次性文件中取消定稿

  • 我是否保证即使主机没有调用IDisposable,编译器或其他东西也会调用IDisposable

Psuedo代码:

public class MyDLL  : SomeHostICantControl, IDisposable
{
    public SpinLock MyDictionarySpinlock = new Spinlock; // approximate syntax
    public static Dictionary<string, string> MyDictionary = null;
    public static Timer MyCleanUpTimer = null;

    public static MyDLL()
    {
        // Set up Cache Here ... how do I dispose of it?
        MyDictionary = new Dictionary<string, string>();

       // remove old data from the dictionary, use spinlock to sync writes
       // or use concurrent dictionary in .NET 4
       MyCleanUpTimer = new Timer(); // run every hour
    }

    // many instances will be created and disposed of.  I have no control when or how often
    public void MyDll()
    {
       this.MyHostEvent += New Event Handler....
    }

    //.. some event handler code here


    public void Dispose()
    {
       this.MyHostEvent -= Event Handler.;
       // Do I need to suppressFinalize here?
    }

    //~MyDll()
   //{
   // Is this the right place to clean up after my constuctor?
   //}
}
公共类MyDLL:SomeHostICantControl,IDisposable
{
公共自旋锁MyDictionarySpinlock=新自旋锁;//近似语法
公共静态字典MyDictionary=null;
公共静态计时器MyCleanupTime=null;
公共静态MyDLL()
{
//在这里设置缓存…如何处理它?
MyDictionary=新字典();
//从字典中删除旧数据,使用自旋锁同步写入
//或者在.NET4中使用并发字典
MyCleanupTime=new Timer();//每小时运行一次
}
//许多实例将被创建和处理。我无法控制何时或多久创建一次
公共void MyDll()
{
this.MyHostEvent+=新事件处理程序。。。。
}
//…这里有一些事件处理程序代码
公共空间处置()
{
this.MyHostEvent-=事件处理程序。;
//我需要在这里下车吗?
}
//~MyDll()
//{
//这是清理我的建筑工人的地方吗?
//}
}

按顺序回答您的问题:

静态字段存在于应用程序的生命周期中,因此它们会在应用程序退出时被“清理”(内存被回收,文件被关闭等)。您似乎没有执行任何可能需要采取显式操作来清理的操作(例如,将StreamWriter中的缓冲数据刷新到文件),但您的代码段中可能缺少详细信息

如果您的类有一个终结器(您的类似乎没有注释掉),或者如果有人可以从您的类派生并可能引入需要清理的非托管资源,则需要在
Dispose()
方法中禁止finalize。后者在这里适用,因为您的类没有标记为
密封的
,因此您应该在
Dispose()
中禁止finalize


运行时不会调用
Dispose()
,但是如果存在终结器,它将调用终结器。但是请注意,由于类实例似乎没有使用任何非托管资源,因此不需要终结器。

因此,如果我的DLL主机不调用Dispose,而CLR也不调用Dispose,这是否意味着除非我将清理代码放入解构器中,否则我的构造函数将永远不会清理事件。我很清楚“~”是终结符吗?我不想创建内存泄漏是的,~MyDll()是终结器,但是,请记住,不再有任何对类的引用,它将由GC清理,并且由于事件订阅不是静态的,它也将消失,而无需显式取消订阅。谢谢,既然我的计时器是静态的,我应该在那里清理吗?如果我想我不必这样做,并且GC会这样做,那么我想终结器只适用于非托管代码。由于计时器是静态的,它将一直持续到应用程序退出,当这种情况发生时,计时器将自动清理。你没有什么需要(或可以)做的。