Winform 多线程--解决界面卡死问题
public class ThreadInvoker
{
/// <summary>
/// 回调委托 带参数的
/// </summary>
/// <param name="InvokerClass"></param>
public delegate void CallbackFunc(InvokerClass InvokerClass);
/// <summary>
/// 回调委托的方法
/// </summary>
public CallbackFunc AsynCallback;
/// <summary>
/// 线程
/// </summary>
public Thread thread;
/// <summary>
/// 执行循环停止属性
/// </summary>
public bool Stop = false;
/// <summary>
/// 休眠间隔
/// </summary>
public int Sleep = ;
public ThreadInvoker(CallbackFunc callback)
{
AsynCallback = callback;
}
public virtual void Start(ThreadStart ThreadStart)
{
thread = new Thread(ThreadStart);
thread.Start();
} public virtual void Start(ParameterizedThreadStart ThreadStart)
{
thread = new Thread(ThreadStart);
thread.Start();
}
}
public class InvokerClass
{
public string String { get; set; } }
使用方法
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ThreadInvoker ti; private void Form1_Load(object sender, EventArgs e)
{ } public void Excete(object InvokerClass)
{
InvokerClass _InvokerClass = InvokerClass as InvokerClass;
while (!ti.Stop)
{
if (null == _InvokerClass)
_InvokerClass = new InvokerClass(); _InvokerClass.String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ti.AsynCallback(_InvokerClass);
Thread.Sleep(ti.Sleep);
}
} public void AsynUpdateTxtMethod(InvokerClass InvokerClass)
{
if (this.richTextBox1.InvokeRequired)
{
this.BeginInvoke(new ThreadInvoker.CallbackFunc(updatemethod), InvokerClass);
}
else
{
updatemethod(InvokerClass);
}
} public void updatemethod(InvokerClass InvokerClass)
{
this.richTextBox1.AppendText(InvokerClass.String + "\r\n");
this.richTextBox1.ScrollToCaret();
} /// <summary>
/// 启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
ti = new ThreadInvoker(AsynUpdateTxtMethod);
ti.Stop = false;
ti.Start(new System.Threading.ParameterizedThreadStart(Excete));
} private void button2_Click(object sender, EventArgs e)
{
ti.Stop = true;
}
}

实现效果
Winform 多线程--解决界面卡死问题的更多相关文章
- C#多线程解决界面卡死问题
C#多线程解决界面卡死问题的完美解决方案 文章下最方有源码下载 问题描述:当我们的界面需要在程序运行中不断更新数据时, 当一个textbox的数据需要变化时, 对于这个问题可以先参考下我的另外一个文章 ...
- C#多线程解决界面卡死问题的完美解决方案
C#多线程解决界面卡死问题的完美解决方案 文章转自http://www.sufeinet.com/thread-3556-1-1.html 问题描述: 当我们的界面需要在程序运行中不断更新数据时, 当 ...
- C#多线程解决界面卡死问题的完美解决方案,BeginInvoke而不是委托delegate 转载
问题描述:当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决一个主线程来创建界面,使用一个子线程来执行程 ...
- winform 防止主界面卡死
总结网络上的解决方案:新线程=> 委托=> 主界面的异步更新方法(IAsyncResult BeginInvoke(Delegate method)),一句话就是通过委托调用另一个线程的异 ...
- 多线程、委托、Invoke解决winform界面卡死的问题,并带开关
一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...
- WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
原文地址: http://www.tuicool.com/articles/F7reem http://blog.csdn.net/yl2isoft/article/details/11711833 ...
- Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...
- Delphi编程防止界面卡死的方法经验分享
Delphi编程防止界面卡死的方法经验分享! 1.循环里面防止界面卡死的方法可以使用Application.ProcessMessages: 例如下列方法: var n: Integ ...
- WinForm多线程+委托防止界面卡死
1.当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Gener ...
随机推荐
- 百度图片http://img[0-9]\.imgtn.*?g此形式的链接图片下载方式
"""给出图片链接列表, 下载图片""" print(pic_urls) for pic_url in pic_urls: try: hos ...
- Win7 VS2015环境编译NanoVG
书接上回,Cairo编译好使用后,发现简单的每帧画100条随机线段就卡得不行,装了个gooreplacer( http://liujiacai.net/gooreplacer/ )上stackover ...
- 先加载js 后载控件
可以使用如下 $(document).on('click','.classname',function(){});
- openstack之镜像管理
概览 [root@cc07 fast-pulsar]# glance help | grep image [--os-image-url OS_IMAGE_URL] [--os-image-api-v ...
- silverlight学习之页面传值篇
1.silverlight 实现页面导航跳转 (1)利用根视图 A.修改App.xmal.cs //使用根视图实现页面导航跳转 //申明一个Grid对象 ...
- asp.net文件上传下载
泽优大文件上传产品测试 泽优大文件上传控件up6,基于php开发环境测试. 开发环境:HBuilder 服务器:wamp64 数据库:mysql 可视化数据库编辑工具:Navicat Premium ...
- spring ioc beanfactory 关系图
spring security类关系图 mybatis-spring源码解析类关系图 Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析 转: sprin ...
- 1.8.1suspend与resume方法使用
暂停线程意味着线程还能恢复运行 suspend()方法暂停线程.resume()恢复线程 测试如下 package com.cky.thread; /** * Created by edison on ...
- ibatis.net之我的调整:Update语句的动态set字段
动态Update语句 如果Map中指定多个字段 <update id="UpdateStaff"> update Staff set Name=#Name#,InDat ...
- 1101 Quick Sort
There is a classical process named partition in the famous quick sort algorithm. In this process we ...