WinForm多线程+委托防止界面卡死

1、当有大量数据需要计算、显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace WindowsFormTest{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

Thread drawThread = null;
delegate void drawDelegate(int i);

//开启子线程
private void btnTest_Click(object sender, EventArgs e)
{
closeThread();

drawThread = new Thread(new ThreadStart(draw));
drawThread.IsBackground = true;
drawThread.Start();
}

//draw子线程,循环调用test函数,并且等待一会
private void draw()
{
try
{
for (int i = 0; i < 100000000; i++)
{
test(i);
Thread.Sleep(100);
}
}
catch (System.Exception e1)
{
return;
}

closeThread();
}

//test函数,向textBox中添加数据
private void test(int i)
{
if (textBox1.InvokeRequired)
{
drawDelegate d = new drawDelegate(test);
Invoke(d, new object[] {i });
}
else
{
textBox1.AppendText(i.ToString()+"\r\n");
}
}

//结束子线程
private void closeThread()
{
if (drawThread != null)
{
if (drawThread.IsAlive)
{
drawThread.Abort();
}
}
}

//窗体关闭时,关闭子线程
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
closeThread();
}
}
}

WinForm多线程+委托防止界面卡死

时间: 2024-10-18 20:40:02

WinForm多线程+委托防止界面卡死的相关文章

WinForm 多线程+委托来防止界面假死

参考: http://www.cnblogs.com/xpvincent/archive/2013/08/19/3268001.html 当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sy

【C#】多线程解决UI界面卡死的问题

一个经典的例子: http://www.cnblogs.com/wangchuang/p/4485797.html 问题: 都说Invoke是同步的,BeginInvoke是异步的,但为何用BeginInvoke做耗时操作依然会卡死UI? http://www.cnblogs.com/blosaa/archive/2013/05/30/3107381.html 小结: BeginInvoke的异步是指相对于调用BeginInvoke的线程异步,而不是相对于UI线程异步.所以在UI线程调用Begi

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

一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义委托类型变量,然后传递给Invoke方法. 如果其他线程直接调用方法更新控件内容,报错:线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它. 2,委托的本质是某一类型的方法,这些方法具有相同的参数和返回类型. 委托类似于C语言中的函数指针,可以指向多个相同类型的函数. 定义委托

WinForm多线程及委托防止界面假死

当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Syste

winform防止界面卡死的三种方法

在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以winform为例子,介绍三种方法防止界面卡死,对这几个方法稍加修改同样适用于wpf,silverlight等程序 首先给出一个函数模拟耗时操作 1使用委托+QueueUserWorkItem delegate void ChangeInvoke(int num) ; private void ChangeNum(int num) { MessageBox.Show(num.ToString());

winform 防止主界面卡死

总结网络上的解决方案:新线程=> 委托=> 主界面的异步更新方法(IAsyncResult BeginInvoke(Delegate method)),一句话就是通过委托调用另一个线程的异步方法. 验证方法:当线程执行时,拖拽主窗体,没有卡死迹象. 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawi

winform批量更新数据_长时间的执行会导致界面卡死

原文:winform批量更新数据_长时间的执行会导致界面卡死 前言:使用winform触发一个事件后执行的代码,如果耗时非常长,则会导致窗口界面假死!  本人最近通过winform窗体执行一项:需要批量更新一批数据库的数据的操作的任务时,由于数据量达到百万级别,非常耗时,只能慢慢更新,慢慢执行. 但是,在执行的过程遇到了一个奇葩的问题:窗体在调试状态下,代码可以慢慢循环执行,没出现异常.  但是我单独运行EXE程序时,就必现:程序假死,未响应状态. 后台百度虽然没有找到直接的答案,但是也发现了原

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

这方面的文章已经写得很详细了,特地摘引两篇文章 http://www.cnblogs.com/c2303191/articles/826571.html http://www.cnblogs.com/EasonLeung/p/3683492.html http://www.cnblogs.com/Rustle/articles/11301.aspx 然后我想把自己的理解记录下来,做一个笔记. 1.Control的Invoke和BeginInvoke的委托方法是在主线程,即UI线程上执行的,异步是

二、UI线程和界面卡死

上回说到,在Windows窗体程序中,响应Windows消息的线程就被称做Windows窗体程序的UI线程.UI线程还有一个重要的功能是创建和管理窗体和窗体中的各种控件,负责他们的实时刷新,如果UI线程在处理某个消息的时候耗时特别长,那么后续的消息就无法及时响应,看上去的感觉就是“界面卡死”了.此外,为了避免出现线程安全类的问题,UI控件是不能多线程访问的,一个backgroundworker线程直接去刷新控件,这是绝对不允许的,但这种需求又是客观存在的(比方说从数据库中获取数据后刷新到控件中)