当前位置:  开发笔记 > 编程语言 > 正文

从另一个线程中捕获异常

如何解决《从另一个线程中捕获异常》经验,为你挑选了2个好方法。

我有一个单独的线程运行的方法.该线程是从Windows应用程序中的表单创建和启动的.如果从线程内部抛出异常,将其传递回主应用程序的最佳方法是什么.现在,我将对主窗体的引用传递给线程,然后从线程调用该方法,并使该方法被主应用程序线程调用.是否有最好的练习方法,因为我现在对自己的表现不满意.

我的表格示例:

public class frmMyForm : System.Windows.Forms.Form
{
    /// 
    /// Create a thread
    /// 
    /// 
    /// 
    private void btnTest_Click(object sender, EventArgs e)
    {
        try
        {
            //Create and start the thread
           ThreadExample pThreadExample = new ThreadExample(this);
           pThreadExample.Start();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName);
        }
    }

    /// 
    /// Called from inside the thread 
    /// 
    /// 
    public void HandleError(Exception ex)
    {
        //Invoke a method in the GUI's main thread
        this.Invoke(new ThreadExample.delThreadSafeTriggerScript(HandleError), new Object[] { ex });
    }

    private void __HandleError(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

我的线程类的示例:

public class ThreadExample
{
    public delegate void delThreadSafeHandleException(System.Exception ex);

    private Thread thExample_m;

    frmMyForm pForm_m;
    private frmMyForm Form
    {
        get
        {
            return pForm_m;
        }
    }

    public ThreadExample(frmMyForm pForm)
    {
        pForm_m = pForm;

        thExample_m = new Thread(new ThreadStart(Main));
        thExample_m.Name = "Example Thread";
    }

    public void Start()
    {
        thExample_m.Start();
    }

    private void Main()
    {
        try
        {
            throw new Exception("Test");
        }
        catch (Exception ex)
        {
            Form.HandleException(ex);
        }
    }
}

Jon Skeet.. 17

因此,您正在使用Invoke通过它的外观来回归到UI线程 - 这正是您需要做的.我个人使用Action 是为了简单起见,可能是BeginInvoke而不是Invoke,但基本上你做的是正确的.



1> Jon Skeet..:

因此,您正在使用Invoke通过它的外观来回归到UI线程 - 这正是您需要做的.我个人使用Action 是为了简单起见,可能是BeginInvoke而不是Invoke,但基本上你做的是正确的.



2> jezell..:

请改用.NET框架中的BackgroundWorker类.这是在不同线程上执行UI工作的最佳实践.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有