c# - 多线程异常和处置。为什么 Dispose 没有调用?

标签 c# multithreading dispose

'using'语句保证对于对象将调用Dispose方法。在这个例子中,这没有发生。终结器方法也没有调用。

为什么会这样?当其他线程上可能发生异常时,我如何更改代码以保证处理我的对象?

class Program
{
    static void Main(string[] args)
    {
        Thread th1 = new Thread(ThreadOne);
        Thread th2 = new Thread(ThreadTwo);

        th1.Start();
        th2.Start();

        th1.Join();
        th2.Join();
    }

    static void ThreadOne()
    {
        using (LockedFolder lf = new LockedFolder(@"C:\SomeFodler"))
        {
            // some pay load
            Thread.Sleep(5000);
        }
    }

    static void ThreadTwo()
    {
        // some pay load
        Thread.Sleep(1000);
        throw new Exception("Unexpected exception");
    }
}

public class LockedFolder : IDisposable
{
    private const string FILENAME_LOCK = ".lock-file";
    private bool bLocked = false;

    public string FullPath { private set; get; }

    public LockedFolder(string FullPath)
    {
        this.FullPath = FullPath;
        Lock();
    }

    private void Lock()
    {
        // lock our folder
        Console.WriteLine("Lock " + FullPath);

        //CreateLockFile(Path + FILENAME_LOCK);
        bLocked = true;
    }

    private void UnLock()
    {
        if (!bLocked)
        {
            Console.WriteLine("Already UnLocked " + FullPath);
            return; // already unlocked
        }

        Console.WriteLine("UnLock " + FullPath);

        // unlock our folder
        //DeleteLockFile(Path + FILENAME_LOCK);
        bLocked = false;
    }

    #region IDisposable Members

    private bool disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Free managed resources

            }

            // Free unmanaged resource
            UnLock();
        }

        disposed = true;
    }

    ~LockedFolder()
    {
        Dispose(false);
    }

    #endregion
}

输出:

\Visual Studio 2010\Projects\ExceptionExample\ExceptionExample\bin\Debug>ExceptionExample.exe

Lock C:\SomeFodler

Unhandled Exception: System.Exception: Unexpected exception at ExceptionExample.Program.ThreadTwo() in \visual studio 2010\Projects\ExceptionExample\ExceptionExample\Program.cs:line 36 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

输出无一异常(exception):

\Visual Studio 2010\Projects\ExceptionExample\ExceptionExample\bin\Debug>ExceptionExample.exe Lock C:\SomeFodler UnLock C:\SomeFodler

最佳答案

未处理的异常强制 CLR 终止进程。 .NET 4.0 的关机行为略有不同,终结器将在报告异常后运行。但在早期版本中没有。

您可以通过为 AppDomain.CurrentDomain.UnhandledException 编写事件处理程序来解决此默认行为。记录或报告异常并调用 Environment.Exit()。这允许终结器线程运行并调用您的 Unlock() 方法。

不要依赖于此,无论如何都会有像 StackOverflow 或 FEEE 这样令人讨厌的异常终止进程。是否有人被电源线绊倒或使用 Taskmgr.exe 击中您的进程

关于c# - 多线程异常和处置。为什么 Dispose 没有调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777204/

相关文章:

c# - HttpRequest.Content.IsMimeMultipartContent() 在应该返回 true 时返回 false

c - c中的多线程。互斥体

C# WinForms DragEnter 从不触发

c# - Internet Explorer 工具栏的上下文菜单

java - 完成 future : Why we need stages at all?

java - 实例化非最终静态变量是线程安全的吗?

c# - 处置对象(简化)

arrays - 在 Free Pascal 中处理对象数组

c# - 在 C# 应用程序中处理位图

c# - 当存在 JSON 解析器错误(例如类型不匹配)时,不清楚来自 Asp.Net Core API 模型绑定(bind)的错误请求消息?