热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于BeginInvoke产生异常的问题。

1.以下这段代码是在主窗体中的。privatevoidbutton1_Click(objectsender,EventArgse){
1.以下这段代码是在主窗体中的。

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Class1 c = new Class1();
                new Process(c.TestMethod).BeginInvoke(null,null);
            }
            catch(Exception exp)
            {
                MessageBox.Show(exp.Message);
            }
        }


2.这个是在一个新建的类文件中。

    public delegate void Process();

    public class Class1
    {
        public void TestMethod()
        {
            long i = 0;
            for (; i < 90000000; i++) ; //拖时间
            i = 0;
            long j = 100 / i; //会出现异常除0
        }
    }


如果我用BeginInvoke的话,在TestMethod中出现的异常在主窗体线程中是捕获不到的,大家是怎么做的这部分?而且我发现如果直接运行exe的话,程序没有任何反应,但如果以调试模式运行的话就会出现异常。但无论如何也不能捕获和处理它。

11 个解决方案

#1



    public delegate void Process();

    public class Class1
    {
        public void TestMethod()
        {
            long i = 0;
            for (; i < 90000000; i++) ; //拖时间
              try
            {
              i = 0;
            long j = 100 / i; //会出现异常除0
            }
            catch(Exception ex)
            {
               // Invoke pass to main thread if required here.
            }
        }
    }

#2


IAsyncResult result  = new Process(c.TestMethod).BeginInvoke(null,null);
Thread.Sleep(0);
// Poll while simulating work.
            while(result.IsCompleted == false) {
                Thread.Sleep(10);
            }

            // Call EndInvoke to retrieve the results.
            string returnValue = caller.EndInvoke(out threadId, result);

#3


因为异步调用,在另外线程出现错误时,捕获时机已经错过
   try
            {
                Class1 c = new Class1();
                new Process(c.TestMethod).BeginInvoke(null,null);//启动另外一个线程,此函数接着向下执行,不会等待那个线程出现错误
            }
            catch(Exception exp) 
            {
                MessageBox.Show(exp.Message);
            }

改为
try{
                class1 c = new class1();
                Process ps = new Process(c.TestMethod);
                IAsyncResult ir = ps.BeginInvoke(null, c);
                ps.EndInvoke(ir);
    }
catch(Exception ex )
{
   MessageBox.Show(ex.ToString());
}            

#4


我最近也刚接触异步调用,在 MSDN 中看到的例子似乎都是结束时才处理可能发生过的异常。

#5


每一个BeginInvoke都要有对应的EndInvoke,异常可以在EndInvoke时获得

#6


好像没用呀,还是捕获不到。

    public partial class Form1 : Form
    {
        Process process = null;
        public Form1()
        {
            InitializeComponent();
            Class1 c = new Class1();
            process = new Process(c.TestMethod);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                process.BeginInvoke(null, null);
            }
            catch(Exception exp)
            {
                MessageBox.Show(exp.Message);
            }
        }

        private void EndProcess(IAsyncResult ar)
        {
            try
            {
                process.EndInvoke(ar);
                MessageBox.Show("Task complete!");
            }
            catch
            {
                throw;
            }
            finally
            {
                this.Invoke(new Process(this.Close));
            }
        }
    }


调试时还会出错。

#7


    try
            {
IAsyncResult   ir   =   process.BeginInvoke(null,null); 
process.EndInvoke(ir);
            }
            catch(Exception exp)
            {
                MessageBox.Show(exp.Message);
            }

#8


刚才忘记把EndProcess加进去了,呵呵

现在可以捕获到异常,但为什么在调试的时候捕获不到?

#9


调试时在线程内部出现异常,就已经被调试器截获了

#10


果然是老大,谢谢。

#11



                                if (!this.cardTimeBll.Exists(para1.ToString(), Convert.ToDateTime(para4)))
                                {
                                    if (temp.FCar == string.Empty)
                                    {
                                        temp.FCar = "##";
                                    }
                                    bool isInsert = this.cardTimeBll.Add(temp);
                                    if (!isInsert)
                                    {
                                        temp.FCarState = "##";
                                    } 
                                    IAsyncResult iResult = this.listView1.BeginInvoke(new UpdateListViewEventHandler(updateListView), new object[] { temp });
                                    this.listView1.EndInvoke(iResult);
                                }

推荐阅读
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
Jason
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有