从另一个线程中捕获exception
我有一个在单独的线程中运行的方法。 该线程是从Windows应用程序中的表单创建和启动的。 如果从线程内部抛出exception,将其传递回主应用程序的最佳方法是什么。 现在,我将对主窗体的引用传递给线程,然后从线程调用该方法,并使该方法被主应用程序线程调用。 是否有最好的练习方法,因为我现在对自己的表现不满意。
我的表格示例:
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); } } }
因此,您正在使用Invoke来回归UI线程,通过它的外观 – 这正是您需要做的。 为了简单起见,我个人使用Action
请改用.NET框架中的BackgroundWorker类。 这是在不同线程上执行UI工作的最佳实践。
可能更好的方法是将委托传递给线程而不是对表单本身的引用。
在线程之间抛出exception并不容易,可能并不需要。 相反,您可以使用共享数据结构或变量传递exception,并使用waitHandle在第一个线程上等待。
我完全同意Dror。 以正式的方式,我们可以将此结构称为FaultContract。 从根本上说,当另一个线程发生exception时,客户端线程在那个时刻几乎不能做任何事情,除了收集信息并相应地在它自己的行为中行动。 如果那里有不同的AppPool,那么序列化会有一个额外的复杂性(这可能是一个单独的主题)。
上述就是C#学习教程:从另一个线程中捕获exception分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1019070.html