2 qq405165798 qq405165798 于 2016.04.05 13:21 提问

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();
        }
    }
}


1个回答

caozhy
caozhy   Ds   Rxr 2016.04.05 14:07

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

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

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

qq405165798
qq405165798 请移步http://bbs.csdn.net/topics/391928853
2 年多之前 回复
qq405165798
qq405165798 我奇怪的是,, 正常的阻塞应该不超过10ms,这个Invoke中的阻塞永远不会结束,貌似是死了. 这两种调用方法,都是BeginInvoke开始,都会在产生的线程中调用 Invoke,都在主线程中EndInvoke. 为什么第一种只要等10ms就完成,第二种就永久的卡死了呢?
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
黄聪: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. 线程同步的
Invoke和BeginInvoke的真正含义
日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一)Control的Invoke和BeginInvoke 我们要基于以下认识: (1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。 (2)Con
Invoke和BeginInvoke的使用(转载)
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。  一、为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。 1、windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着
WPF的Invoke()和BeginInvoke()
近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一)Control的Invoke和BeginInvoke 我们要基于以下认识: (1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。 (2)Co
C# 中的invoke和begininvoke
原文地址:http://www.cnblogs.com/Z-King/archive/2011/11/03/2234337.html   1. control中的invoke、begininvoke。   2. delegrate中的invoke、begininvoke。     这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begin
C# delegate方法invoke和beginInvoke的区别
class Program     {         delegate void test();         static void Main(string[] args)         {             test ts = new test(TestDelegate);             ts.BeginInvoke(null,null);         
C#中Invoke 和 BeginInvoke 的区别(多线程调用Winform)
今天师弟问我SuperGridControl的线程安全问题,我查了一下资料,不知道下面方法是否能解决,但是感觉这个函数很不错,记下来以后试试。 原文连接 相关资料:Invoke 和 BeginInvoke 的真正涵义 、在多线程中如何调用Winform Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的
委托的invoke、beginInvoke和控件的invoke、beginInvoke的区别
原文地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html  在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法。   一、为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的
普通方法调用,Invoke,begininvoke三者的区别总结及异步与同步的区别总结
(1)普通方法调用(直接调用)与Invoke()方法调用方法 使用的线程Id是一样的 即属于同步。(2)BeginInvoke(&amp;lt;输入和输出变量&amp;gt;,AsyncCallback callback,object asyncState)方法调用方法 则是启用了新的线程Id       属于异步可通过 Thread.CurrentThread.ManagedThreadId    获取当前线程...
C#中的Invoke和BeginInvoke方法详解
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法。   一、为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。 1、windows程序消息机制 Windo