c# winform异步不卡界面的实现方法

快速阅读

如何在winform程序中,让界面不再卡死。 关于委托和AsyncCallback的使用。

界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动。造成界面卡死的现象。我们只需要把耗时任务放在子线程中执行就可以了。

子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 。

我们来看个例子。

场景

界面上一个按钮加一人richbox , 点击以后获得当前所在年份

代码实现

定义一个委托实现子线程更新主线程

public delegate void UpdateText(string message);

public void UpdateTextMehod(string message)
{
 richTextBox1.Text += message+"\r\n";
 richTextBox1.ScrollToCaret();
}

按钮的点击事件

func委托:表示模拟一个耗时的操作(2s),然后返回一个结果 。

Asynccallback:表示在相应异步操作完成时调用的方法。在这个方法中,获取异步执行的结果。

​ 要获取异步执行的结果,要调用func.EncInvoke(IAsyncResult)

实例化更新主线程 的委托UpdateText,然后异步调用,在func委托的计算结果 赋值给界面

func异步调用 ,把该异步的的回调方法当做参数传入。

 Func<int> func = new Func<int>(() =>
      {
        Thread.Sleep(2000);
        return DateTime.Now.Year;
      });
      AsyncCallback callback=new AsyncCallback((x) =>
      {
        var result=func.EndInvoke(x);
        UpdateText ut = new UpdateText(UpdateTextMehod);
        this.BeginInvoke(ut, result.ToString());

      });

      func.BeginInvoke(callback, "object vlaue");

注意

最后一句代码,可以写成这样,但是会卡死,

var res =func.BeginInvoke(null,null);
var result1 = func.EndInvoke(res).ToString();
richTextBox1.Text += result1.ToString();

所以异步方法的执行结果要放在回调函数中,这样就不会卡死主界面。

切记。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • WinForm窗体调用WCF服务窗体卡死问题

    窗体启动会启动一个程序主线程,如果在From_Load()方法中调用服务,调用服务操作会阻塞主程序. 只需要将调用服务的操作放到其他线程中处理就可以解决这个问题. 比如: 复制代码 代码如下: Thread ServiceThread=null; public void TestForm_Load(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; ServiceThread = new Thread(ne

  • c# winform异步不卡界面的实现方法

    快速阅读 如何在winform程序中,让界面不再卡死. 关于委托和AsyncCallback的使用. 界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动.造成界面卡死的现象.我们只需要把耗时任务放在子线程中执行就可以了. 子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 . 我们来看个例子. 场景 界面上一个按钮加一人richbox , 点击以后获得当前所在年份 代码实现 定义一个委托实现子线程更新主线程 public

  • JavaScript中实现异步编程模式的4种方法

    你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他

  • Android编程实现异步消息处理机制的几种方法总结

    本文实例讲述了Android编程实现异步消息处理机制的几种方法.分享给大家供大家参考,具体如下: 1.概述 Android需要更新ui的话就必须在ui线程上进行操作.否则就会抛异常. 假如有耗时操作,比如:在子线程中下载文件,通知ui线程下载进度,ui线程去更新进度等,这个时候我们就需要用到异步消息处理. 一.什么是Handler Handler是Android提供用来异步更新UI的一套机制,也是一套消息处理机制,可以用它来发送消息,也可以用它来接收消息. 二.为什么使用Handler Andr

  • Ajax请求二进制流进行处理(ajax异步下载文件)的简单方法

    摘要: ajax请求一个二进制流(文件),转换为Blob进行处理或者下载保存文件 需求 管理后台需要随时下载数据报表,数据要实时生成后转换为excel下载. 文件不大,页面放置"导出"按钮,点击按钮后弹出保存文件对话框保存 说明:第一种方法使用a标签直接可以满足大部分人需求,第二种方法纯粹是在说实现方法以及更好的操作体验,不需要(举一个需要第二种方法的例子:如果生成很慢就需要生成过程中禁用按钮,防止连续生成)用到的可以不用看 解决方案 方法一 请求文件的接口能改为GET则可以使用这种方

  • 在uiview 的tableView中点击cell进入跳转到另一个界面的实现方法

    1.先重写uiviewcontrol的方法 - (UIViewController *)viewController { for (UIView* next = [self superview]; next; next = next.superview) { UIResponder *nextResponder = [next nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) { return

  • C#中winform使用相对路径读取文件的方法

    本文实例讲述了C#中winform使用相对路径读取文件的方法.分享给大家供大家参考.具体分析如下: 目录结构如下图所示:   方法一:由于生成的exe文件在bin\debug目录下,可以使用向上查找目录的方式获取要读取的xml文件 复制代码 代码如下: string haarXmlPath = @"../../haarcascade_frontalface_alt_tree.xml"; FileInfo file = new FileInfo(fileName); string  fu

  • WinForm实现自定义右下角提示效果的方法

    本文实例讲述了WinForm实现自定义右下角提示效果的方法.分享给大家供大家参考.具体实现方法如下: 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; namespace IcoFl

  • winform实现关闭按钮失效的两种方法

    本文实例讲述了winform实现关闭按钮失效的两种方法.分享给大家供大家参考.具体如下: 第一种: protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE) { return; } base.WndProc(ref

  • C#实现异步连接Sql Server数据库的方法

    本文实例讲述了C#实现异步连接Sql Server数据库的方法.分享给大家供大家参考.具体分析如下: .net最新版提供了await方法,可以使我们可以很容易实现到数据库的异步连接 复制代码 代码如下: readonly string ConnectionString = "Data Source=database_server_name;Initial Catalog=Store;Integrated Security=True"; protected async void Exec

  • C#.net实现在Winform中从internet下载文件的方法

    本文实例讲述了C#.net实现在Winform中从internet下载文件的方法.分享给大家供大家参考.具体如下: 自己做了一个通用的软件自动升级程序,其中需要从给定的url下载文件到本地,共享一下. /// <summary> /// 下载文件 /// </summary> /// <param name="URL">下载文件地址</param> /// <param name="Filename">下载

随机推荐