Begininvoke中嵌套Invoke发生了阻塞,求解决

为什么button2_Click()不能正确执行?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication35
{
    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
            Button btn1 = new Button();
            btn1.Text = "btn1"; btn1.Dock = DockStyle.Left;
            btn1.Click += this.button1_Click;
            this.Controls.Add(btn1);
            Button btn2 = new Button();
            btn2.Text = "btn2";  btn2.Dock = DockStyle.Left;
            btn2.Click += this.button2_Click;
            this.Controls.Add(btn2);           
        }


        /// <summary>
        /// 可以正确执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            ((Button)sender).Text = "Running...";
            dlg_void_void pf = new dlg_void_void(SetFormText);
            var aysncRst = this.BeginInvoke(pf);
            this.EndInvoke(aysncRst);
            ((Button)sender).Text = "Complete";
        }
        /// <summary>
        /// 在执行后阻塞在SetFormText()的 this.Invoke(pf);
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            ((Button)sender).Text = "Running...";
            dlg_void_void pf = new dlg_void_void(SetFormText);
            var aysncRst = pf.BeginInvoke(null, null);
            pf.EndInvoke(aysncRst);
            ((Button)sender).Text = "Complete";

        }
        delegate void dlg_void_void();
        private void SetFormText()
        {
            if (this.InvokeRequired)
            {
                dlg_void_void pf = new dlg_void_void(SetFormText);
                this.Invoke(pf);
                return;
            }

            var sum = 0;
            for (int i = 0; i < 10; i++)
            {
                sum += i;
            }
            this.Text = sum.ToString();
        }
    }
}


c#

1个回答

你写
pf.EndInvoke(aysncRst);
能不阻塞么?

去掉这一行,把((Button)sender).Text = "Complete";写在BeginInvoke的第二个参数的委托中

这里有个例子
http://www.bubuko.com/infodetail-578212.html

qq405165798
qq405165798 请移步http://bbs.csdn.net/topics/391928853
大约 4 年之前 回复
qq405165798
qq405165798 我奇怪的是,, 正常的阻塞应该不超过10ms,这个Invoke中的阻塞永远不会结束,貌似是死了. 这两种调用方法,都是BeginInvoke开始,都会在产生的线程中调用 Invoke,都在主线程中EndInvoke. 为什么第一种只要等10ms就完成,第二种就永久的卡死了呢?
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Invoke和BeginInvoke的真正含义

日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一)Control的Invoke和BeginInvoke 我们要基于以下认识: (1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。 (2)Con

黄聪:C#多线程教程(1):BeginInvoke和EndInvoke方法,解决主线程延时Thread.sleep柱塞问题(转)

黄聪:C#多线程教程(1):BeginInvoke和EndInvoke方法,解决主线程延时Thread.sleep柱塞问题(转) 开发语言:C#3.0 IDE:Visual Studio 2008 本系列教程主要包括如下内容: 1.  BeginInvoke和EndInvoke方法 2.  Thread类 3. 线程池 4. 线程同步基础 5. 死锁 6. 线程同步的

深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)

深耕 WPF 开发的各位程序员大大们一定避不开使用 Dispatcher。跨线程访问 UI 当然免不了用到它,将某个任务延迟到当前任务之后执行也会用到它。Dispatcher.Invoke、Dispatcher.BeginInvoke 是过去大家经常使用的方法,而 .Net Framework 4.5 中微软为我们带来了 Dispatcher.InvokeAsync 方法,它和前面两个有何不同?

C# 多线程操作界面时,使用Invoke与BeginInvoke的区别

Invoke方法的参数很简单,一个委托,一个参数表(可选),而Invoke方法的主要功能就是帮助你在 UI线程(即创建控件的线程)上调用委托所指定的方法。Invoke方法首先检查发出调用的线程(即当前线程)是不是UI线程,如果是,直接执行委托指向 的方法,如果不是,它将切换到UI线程,然后执行委托指向的方法。不管当前线程是不是UI线程,Invoke都阻塞直到委托指向的方法执行完毕,然后切换 回发出

C#中Invoke 和 BeginInvoke 的区别(多线程调用Winform)

今天师弟问我SuperGridControl的线程安全问题,我查了一下资料,不知道下面方法是否能解决,但是感觉这个函数很不错,记下来以后试试。 原文连接 相关资料:Invoke 和 BeginInvoke 的真正涵义 、在多线程中如何调用Winform Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的

普通方法调用,Invoke,begininvoke三者的区别总结及异步与同步的区别总结

(1)普通方法调用(直接调用)与Invoke()方法调用方法 使用的线程Id是一样的 即属于同步。(2)BeginInvoke(&amp;lt;输入和输出变量&amp;gt;,AsyncCallback callback,object asyncState)方法调用方法 则是启用了新的线程Id       属于异步可通过 Thread.CurrentThread.ManagedThreadId    获取当前线程...

委托的invoke、beginInvoke和控件的invoke、beginInvoke的区别

原文地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html  在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法。   一、为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的

WPF线程详解(五)——BeginInvoke

本文将通过一个WPF模拟程序来演示一下界面卡死的现象,并通过修改代码来解决界面卡死的问题。希望通过对本文的学习,大家能对Dispatcher.BeginInvoke()方法有一个新的认识。文章开篇直接给出界面卡死的示例代码。示例WPF程序,用来计算1~n的和值,这里的n可以是1亿~25 亿之间的某个值,通过界面录入,结果显示在n输入框后面的文本框中,既然是WPF程序,代码包含xaml及cs代码两部...

理解串行并行、同步异步与invoke、begininvoke和endinvoke的关系

首先这是我自己理解的结果,后面随着学习的深入发现问题的话我会再回来改。 串行和并行给我的感觉更多的是方法上的执行顺序 同步与异步给我更多的感觉是线程中的执行顺序,在这里我之前也遇到了一个误区,认为开了工作线程的话,那应该就是异步,然而这种理解是错误的。 在学校的时候,我们应该都接触过信号量机制SemaphoreSlim,这属于同步机制,我们在这里也开启了多个线程。 谈到线程,我也想说一下t

回调方法及invoke、begininvoke理解

回调方法    class小明的方法Hello()调用class大头的方法world(),方法world( )又调用小明的方法Hello()………………,这不是成死循环了,显然回调不是这样搞的。    classA的方法first()调用classB的方法second(),而classB的方法second()又调用classA的方法helloWorld(),此时helloWorld()就是他妈的回...

任运自在:线程(Thread)与委托(Invoke和BeginInvoke)和封装

线程(Thread)与委托(Invoke和BeginInvoke) 这几天专门玩线程与委托,到处查找资料看,渐渐明白了用法、写法和一些注意事项; 描述: 什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,

C#的Invoke和BeginInvoke、多线程中的界面更新

<br />http://archive.cnblogs.com/a/11301/<br />http://www.cnblogs.com/moses/archive/2009/12/16/1625843.html<br />看了上面两篇文章,按个人理解,Invoke和BeginInvoke分为委托类和Control类,Control类的调用Invoke和BeginInvoke都是在UI线程中执行的,BeginInvoke会在调用后继续往下走,而Invoke必须在委托方法执行完才往下走。<br /> <br

C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法

1.C#中的每一个委托都内置了BeginInvoke和EndInvoke方法,如果委托的方法列表里只有一个方法,那么这个方法就可以异步执行(不在当前线程里执行,另开辟一个线程执行)。委托的BeginInvoke和EndInvoke方法就是为了上述目的而生的。 2.原始线程发起了一个异步线程,有如下三种执行方式: 方式一:等待一直到完成,即原始线程在发起了异步线程以及做了一些必要处理之后,原始线

C# 调用目标异常

C#调用目标异常最近在做公司的软件的时候,发现一个问题,由于要使用到多线程Thread类,所以就开启了挺多的线程,但是当我们要在其他的线程上去修改主线程上创建的控件的时候就通常会使用 if(this.InvokeRequired) { this.BeginInvoke(new Action<Control, bool, string>(SetControlEn

C#窗体中Invoke和BeginInvoke方法详解

C#窗体中Invoke和BeginInvoke方法详解

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke 解决

在Window窗体程序开发的时候,如果使用多线程编程,在子线程中访问主线程窗体内的控件,就需要使用控件的Control.Invoke方法或者BeginInvoke方法。但是有时候因为Window执行速度太快,尤其是你写代码的时候在InitializeComponent();完成之前起了一个线程去执行某些操作,涉及到窗体控件的,当你在调用Control.Invoke的时候,就可能出现 “在创建窗口句

C# 用委托BeginInvoke做异步线程

一个应用场景,浏览器上传一个文件,此文件后台调用文件转换,需要耗费相当长的时间,这样,如果是一个线程同步式的做下去,那么用户在浏览器上感觉就是卡住了,卡卡卡卡,这里我们利用委托的BeginInvoke和EndInvoke方法操作线程,BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值

C# 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke错误的解决办法

在使用

C#中Invoke与BeginInvoke的区别(另附使用循环创建多个线程)

C#中Invoke与BeginInvoke的区别(另附使用循环创建多个线程)rnrnusing System;nusing System.Collections.Generic;nusing System.ComponentModel;nusing System.Data;nusing System.Drawing;nusing System.Linq;nusing System.Text;nus

"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

参考自:http://blog.csdn.net/banket004/article/details/8722075“在Window窗体程序开发的时候,如果使用多线程编程,在子线程中访问主线程窗体内的控件,就需要使用控件的Control.Invoke方法或者BeginInvoke方法。但是有时候因为Window执行速度太快,尤其是你写代码的时候在InitializeComponent();完成之前起

BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较

速度(最快为1) 返回值 多参数 等待在时限内完成 超时后结束 ThreadPool.UnsafeQueueUserWorkItem() 1 非原生支持1 非原生支持 非原生支持3 不支持 ThreadPool.QueueUserWorkItem() 2.7 非原生支持1 非原生支持 非原生支持3

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

在C#开发的过程中多线程委托是经常用的,今天在测试以前写的软件的时候发现有个问题,报 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。 这样的错误。 仔细检查,是在调用一个委托的时候出来的,有时候还会把软件都关闭掉。这个问题很严重,当然这样是我不是正常操作的时候才会产生的,也就是之前没注意到的问题。 在调用下一个委托的时候。先判断下 在控件上面或者窗体上

异步委托操作BeginInvoke和EndInvoke

BeginInvoke,有两个参数,一个调用方法的参数列表。 例如:delegate int TestDelegate(int i);int Add(int i){    }TestDelegate td=new TestDelegate(Add);td.BeginInvoke(1/*params*/,null,null); 代码中 1 就是参数列表了,数量可以是0-N,数

委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件

1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象。一个委托代表了具有相同参数列表和返回值的所有函数。 class Program { delegate int CalculateDelegate(int a,

C#修改AD域的用户密码时报“调用的目标发生了异常”的问题。

为了帮助网友解决“C#修改AD域的用户密码时报“调用的目标”相关的问题,中国学网通过互联网对“C#修改AD域的用户密码时报“调用的目标”相关的解决方案进行了整理,用户详细问题包括:异常密码c#计算机程序报这样的问题“操作失败,错误原因:System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.Runtime.Inter

多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)

多线程委托之跨线程问题分析 今天在写一个程序测试运行跨线程同步的时候出一个异常信息。 异常信息:System.InvalidOperationException “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke” 这程序目前发现这异常出错原因: 可能是一个方法无法调用一个对象的一个方法且该对象的状态无法支持该方法调用,则引发了此异常。通过

Winform异步解决窗体耗时操作(Action专门用于无返回值,Func专门用于有返回值)

#region 调用timer控件实时查询开关机时间 private void timer1_Tick(object sender, EventArgs e) { string sql = "SELECT startTime,endTime,AMTusername,AMTpassword,AMTip FROM AmtTiming at, AmtComputer ac WHERE at.ci

sql server 2008 创建窗口句柄之前不能在控件上调用invoke或begininvoke

今天重装sql server2008时,出现了异常,以前都没有这种shi

当前上下文中不存在名称 "Invoke "

private   void   timer1_Tick(object   sender,   EventArgs   e)//时钟事件       {                         Label   lab   =   new   Label();                         Random   rm   =   new   Random();        

Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态。 通过阅读代码发现,主要是由于Dispatcher.BeginInvoke()方法使用不当导致的。 本文将通过一个WPF模拟程序来演示一下界面卡死的现象,并通过修改代码来解决界面卡死的问题。 希望通过对本文的学习,大家能对Dispatcher.BeginInvoke()方法有一个新的认识。 文章开篇直接给出

C_窗体中Invoke和BeginInvoke方法详解

C_窗体中Invoke和BeginInvoke方法详解 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等

【转】【UNITY3D 游戏开发之六】UNITY 协程COROUTINE与INVOKE

本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi ) 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/unity3d-game/1610.html           ☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!                 这里Himi强调一点:Unity里面的协程并不是线程

匿名委托 Invoke,Predicate<T> 委托

1、匿名方法 //用匿名方法定义委托 class Program { delegate string MyDelagate(string val); static void Main(string[] args) { string str1 = " 匿名方法外部 ";

C# Control的Invoke和BeginInvoke及其实现机制(消息循环)

与C++不同,C#语言禁止在创建某个控件的线程外对控件进行访问,否则会引起访问违规的异常。但有些时候,我们的确需要从其他线程对控件,此时就需要借助于Invoke和BeginInvoke之手了。我们先来对Invoke进行介绍。 Invoke是控件Control的成员方法,函数有两个重载版本: Invoke(Delegate) 在拥有此控件的基础窗口句柄的线程上执行指定的委托。 Invo

c#使用MethodInvoker解决跨线程访问控件

.net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIllegalCrossThreadCalls = false;可以实现访问,但是出不出错不敢保证C#跨线程访问控件运行时错误。 使用MethodInvoker即可解决: 原代码:          private void btnOK_Click(obj

安装SQL Server出现在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法

以下是错误报告: 标题: SQL Server 安装程序失败。 ------------------------------ SQL Server 安装程序遇到以下错误: 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvok

C#中多线程更新Chart控件与BeginInvoke

C#中多线程更新Chart控件与BeginInvoke最近把之前修改的MFC平台上的监控程序移植到C#上,需要用到图形控件显示监控曲线,C#中的现成的Chart控件为首选,但是在后台线程中更新Chart数据是总是在接收数据并刷新Chart时Chart控件上的图形变成一个大红叉,如下图所示,一个下午都没查出来为什么,后来在论坛上看到有人说需要利用BeginInvoke委托,就去看了MSDN上的介绍,按

C# Winform 后台线程阻塞 窗体界面无响应解决办法--BeginInvoke

话不多说,先上代码。(纯手打,有错误请指出来) //导入按钮点击事件 private void btn_import_Click(object sender,EventArgs e) { //1.绑定需要执行的操作方法 var act = new Action(Import); act.BeginInvoke(ar =&amp;amp;gt; act.EndInvoke(ar),...

Assembly 调用的目标发生了异常

Assembly 调用的目标发生了异常快捷键

Invoke和BeginInvoke对比介绍

就Invoke和BeginInvoke进行对比介绍,穿插了一些例子在里面

Invoke 与BeginInvoke的区别

让你快速掌握INvoke与BeginInvoke的区别,HAHA

wpf中invoke传递参数时传递ref参数或者out参数无效

在用Dispatcher.Invoke()访问主线程控件时,要把text相关控件的text信息输出,又不想用全局变量,想用ref参数在invoke函数中修改ref的参数值,达到输出text的效果,可是ref进去的值始终得不到赋值,google发现很多ref参数不能传递的问题,stack overflow上有个多人认同的答案,可惜本人运行不了,只能另辟途径,通过delegate函数返回值得方式得到想

invoke和beginInvoke

很详细、明确的讲解了invoke和beginInvoke的区别,以及二者所用的场合和情况,如果需要确实值得一看

EF 正在运行转换: System.Reflection.TargetInvocationException: 调用的目标发生了异常。

错误 1 正在运行转换: System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.IO.FileNotFoundException: 无法定位文件    在 Microsoft.VisualStudio.TextTemplating.VSHost.TextTemplatingService.ResolveP

六种多线程方法解决UI线程堵塞

http://blog.csdn.net/oyi319/article/details/6851371 一、六种多线程方法 .NET Framework2.0框架提供了至少4种方式实现多线程,它们是“BackgroundWorker”组件、委托的异步调用、线程池ThreadPool以及线程类Thread;.NET Framework 4.0增加了任务并行库TPL和PLINQ技术,可

C# 为啥用invoke,实际上是处理多线程的问题

C#的async事件,就是异步事件的调用,并不是在主线程里面的,如果直接在async事件里面操作逻辑,比如引起资源共享的错乱。所以就有了invoke和begininvoke control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。 control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执

TCP的阻塞机制

TCP 的拥塞机制 TCP的拥塞机制包括四个 慢启动 拥塞规避 快速启动 快速恢复 下面一个一个的具体说明: (一下为我在网络上摘录的,关于TCP阻塞机制的文章。) 为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congesti

C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

原因:调用窗体时,注册了事件。关闭调用窗体后,没有注销事件。   private void button5_Click(object sender, EventArgs e) { if (Form_ROI == null) { Form_ROI = new ROI(this); ...

c#中Invoke使用方法(线程间操作无效: 从不是创建控件的线程访问它。那么创建它的线程是哪个线程?)

///举个例子,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox.. // 类似: using System.Threading; //启动一个线程 Thread thread=new Thread(new ThreadStart(DoWork)); thread.Start(); /

invoke委托解决“线程间操作无效: 从不是创建控件的线程访问它”的问题

在线程中更改控件属性时,编译器报错:“线程间操作无效: 从不是创建控件的线程访问它”。查看资料后得知这个问题的根本在于,创建新线程后,新线程跟主线程同步运行,这时如果新线程提出对控件进行修改,将被编译器报错,因为可能会出现主线程跟新线程同时对同一控件进行修改的情况,这样就造成了程序执行的混乱。

相关热词 c# dbml文件 修改 c#遍历tree c# 能够控制单片机 c#对象写入数据库 c# 添加activex c#2005 json c# 数据库在云端 c# 字符串移位加密 c#禁用滚轮 c#实体类list去重复
立即提问