c# 跨线程 阻塞-Begininvoke中嵌套Invoke发生了阻塞,求解决

问题描述

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

解决方案

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

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

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

时间: 2016-03-22

c# 跨线程 阻塞-Begininvoke中嵌套Invoke发生了阻塞,求解决的相关文章

java-IntelliJ IDEA中 子项目文件路径问题,求解决

问题描述 IntelliJ IDEA中 子项目文件路径问题,求解决 先看图,然后我仔细解释 最近发现找不到文件,同样的代码在eclipse中可以正常找到,对于idea不熟悉,所以来此请教,我是把一些文件拷resources目录下,发现找不到了,使用相对路径,我看到target/classes中是编译过去了的啊,这个路径该怎么写? 在eclipse中 (1) 主项目包含的两个模块 topsoft-test(web项目) topsoft-utils(java maven项目) (2)(3)(4) 根

eclipse-python已安装了一个包,但是导入包中的模块时报错,求解决方法

问题描述 python已安装了一个包,但是导入包中的模块时报错,求解决方法 我用的是eclipse with pydev,用pip安装了impacket,编译一些impacket的例子时报错,如下图: 但是我是安装了的,在anaconda的lib的sit-packges的impacket下,是有模块ImpackPacket的,如下图: 在ecplipse中能查看模块ImpackPacket的源码的: 就是编译时报错,求解决方法 解决方案 你的编辑器环境是否能找到自己安装的包的路径.是否配置好

android开发-android中播放器的bug,求解决

问题描述 android中播放器的bug,求解决 再做一个关联后台的手机app ,里面主要是无线广播这一块儿,mms://222.90.232.44:8082/fm999_audio 不能播放.是因为加端口号了么 解决方案 Android很全的资料http://download.csdn.net/album/detail/1121

android ListView中嵌套GridView不完全显示如何解决

项目需要,在ListView中显示多张图片,用到了GridView,不过如果使用普通的GridView,Item仅仅只是显示一部分,超出第一行以后的都无法显示了,这个很无语,所以又得继承下GridView重写onMeasure方法去测量子控件的宽高了.. 这里只是贴出自定义GridView的代码,直接在xml中使用,ListView的Adapter中调用即可:  代码如下 复制代码 public class GridViewForListView extends GridView {     p

Ext中ComboBox图片显示有点问题求解决

问题描述 图片在附近里,谢谢Ext.onReady(function(){ var data = [ ['value1','text1'], ['value2','text2'], ['value11','text11'], ['value12','text12'] ]; var store = new Ext.data.SimpleStore({ fields: ['value', 'text'], data: data }); var combo = new Ext.form.ComboBo

一段java代码在myeclipse中输出的是乱码,求解决办法

问题描述 以下JAVA代码运行后,会输出乱码.然而,将http://www.1soccer.com/oddsindex/index/换成http://www.310win.com/info/match/Zucai.aspx?typeID=1&issueNum=2015027,输出却正常.以上网页的代码都是UTF-8的.求解决办法.谢谢.importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamR

Winfrom 如何安全简单的跨线程更新控件

来源:http://www.cnblogs.com/rainbowzc/archive/2010/09/29/1838788.html 由于多线程可能导致对控件访问的不一致,导致出现问题.C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常. 解决办法有两个: 1.不进行线程安全的检查 2.通过委托的方式,在控件的线程上执行   常用写法:(不安全) private void WriteToolStripMsg(string msg, Col

c#Sytem.Threading.Timer线程TimerCallBack委托中方法涉及访问ui成员用考虑跨线程安全问题吗

问题描述 publicpartialclassScreen1{privateSystem.Threading.Timert1;voidScreen1_Opened(System.Objectsender,System.EventArgse){t1=newSystem.Threading.Timer(newTimerCallback(countTimer),null,0,1000);//定时器线程}voidcountTimer(objectob){this.Text1.Text="hello&qu

C#多线程、跨线程与线程安全的示例详解

C#多线程.跨线程与线程安全的示例详解(三种不同方法)  代码如下 复制代码 using System.Threading; public static class Extensions     {         //控件扩展方法(用于跨线程操作),因为为了线程的安全,防止资源竞争出现死锁或不一致的状态,.NET是不允许进行跨线程访问窗体控件的.         public static void SafeCall(this Control ctrl, Action callback)