1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作。也就是说,Invoke是同步的。

问题来了,如果界面线程此时正在等待这个非界面线程的结束,然而这个非界面线程却又在等待界面线程执行完这个Invoke操作时,就会发生死锁。

2.说白了,这个死锁问题,是Invoke执行机制产生的。

3.解开这个死锁的方案也很简单。对于Invoke逻辑没有与界面线程逻辑有任何关系,则可以直接改造界面线程的等待非界面线程的结束操作:

function ThreadUI()

{

while(true)

{

if( Thread_New.ThreadState == Stopped )

{

break;

}

else

{

Sleep(10);

}

}

}

改造成:

function ThreadUI()

{

while(true)

{

if( Thread_New.ThreadState == Stopped )

{

break;

}

else

{

Sleep(10);

Application.DoEvent();//这个语句,会让UI线程处理Invoke队列里的事情

}

}

}

如果Invoke逻辑与界面线程的逻辑,有互相调用甚至加锁的关系,则需要先画图理清楚关系,然后再重新改造整个逻辑。此时,可能需要几个技术来辅助操作:

1.新增线程或队列来分解事务

2.把一些同步方法,改造成异步方法。改造成异步方法后,需要注意gc问题,以及错误处理问题。

3.把一个大任务,按照执行顺序,分解为多个子任务,依次执行。

C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题的更多相关文章

  1. 多线程、委托、Invoke解决winform界面卡死的问题,并带开关

    一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...

  2. windows程序消息机制(Winform界面更新有关)

    windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Win ...

  3. windows程序消息机制(Winform界面更新有关)--转

    1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...

  4. [转载]Winform中Control的Invoke与BeginInvoke方法

    转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvo ...

  5. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  6. [WinForm]WinForm跨线程UI操作常用控件类大全

    前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...

  7. NanUI for Winform发布,让Winform界面设计拥有无限可能

    如今,尽管WPF.UWP大行其道,大有把Winform打残干废的趋势.但是还是有那么一波顽固不化的老家伙们固守着Winform,其中就包括我. 好吧,既然都说Winform做得软件不如WPF界面美观效 ...

  8. Winform 关于委托与Invoke和Begin Invoke的使用

    这方面的文章已经写得很详细了,特地摘引两篇文章 http://www.cnblogs.com/c2303191/articles/826571.html http://www.cnblogs.com/ ...

  9. 总结开发中基于DevExpress的Winform界面效果

    DevExpress是一家全球知名的控件开发公司, DevExpress 也特指此公司出品的控件集合或某系列控件或其中某控件.我们应用最为广泛的是基于Winform的DevExpress控件组,本篇随 ...

随机推荐

  1. MVC常用特性

    MVC常用特性使用   简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...

  2. ProducerConsumerDemo

    package algorithm; public class ProducerConsumer { public static void main(String[] args) { SyncStac ...

  3. FZU 1686 龙之谜 重复覆盖

    兑换0,1模型,如.注意,数据的范围 #include <stdio.h> #include <string.h> #include <iostream> #inc ...

  4. hdu 4465 概率称号

    http://acm.hdu.edu.cn/showproblem.php?pid=4465 第一直觉概率DP但很快被否定,发现只有一个简单的二项分布,但感情的表达,没有对生命和死亡的例子.然后找到准 ...

  5. dapper+linq+json+ztree构建树

    dapper获取实体的集合 /// <summary> /// 获取表tb_sys_zhuowei所有数据 /// </summary> public IEnumerable& ...

  6. 渲染优化 之fixed与返回顶部 以及开启GPU Hack

    fixed元素,常见网站右侧出现一个返回顶部的按钮,滚动的时候,会发现返回顶部这个区域在不停的进行重绘,而返回顶部是position:fixed定位的.这也解释了为什么fixed定位是最耗性能的属性之 ...

  7. CSDN博客导出工具 Mac By Swift

    写这篇文章的主要目的是了解Swift语言本身,如何以及Objc和第三方交互框架 必须先用CSDN帐户登录.您可以导出所有的博客文章,加入YAML当首标信息,包括对应标签和分类在头制品信息,和底座式(原 ...

  8. Play Framework + ReactiveMongo

    Play Framework + ReactiveMongo Play!是一个full-stack(全栈的)Java/Scala Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate ...

  9. bzoj 2109 &amp; 2535 空中管制 解读

    [] [分析]小猪真的是一个很好的问题.我认为这是一个问题洪水.建立拓扑后(便! ).直接把最外层设定序号为1,第二层为2.bfs下去就可以. . . 结果发现:飞行序号不能同样.. . 于是開始想. ...

  10. IT只忍者龟Photoshop简单人像的头发抠图过程

    一.导入素材,加入蒙版 1.导入美女图片 2.导入背景图片 如今须要将美女抠出来放在这个背景上,怎么办?一定会有人想到用通道,抽出.(备注:在ps6以后版本号,抽出已经没有这个选项了). 3.将美女图 ...