在界面开发过程中,会遇到耗时较长的处理过程,一般会将耗时较长的处理放到单独的线程中。然后在界面显示处理进度信息。

实现改效果的两种方式记录:

1. 使用委托:

       //定义委托,在线程中使用
private delegate void SetProgressDelegate(int value, string text);
private delegate void FinishDelegate(); public Form1()
{
InitializeComponent();
} private void btnStart_Click(object sender, EventArgs e)
{
//开启线程
new Thread(new ThreadStart(SubThread)).Start();
} //线程函数
private void SubThread()
{
FinishDelegate finish = new FinishDelegate(Finish);
SetProgressDelegate setProgress = new SetProgressDelegate(SetProgress);
for (int i = 0; i <= 100; i++)
{
//跨线程调用委托
this.Invoke(setProgress, new object[] { i, string.Format("{0}%", i) });
Thread.Sleep(100); //模拟耗时任务
}
this.Invoke(finish);
}
private void SetProgress(int value, string text)
{
this.progressBar.Value = value;
this.lblProgressText.Text = text;
} private void Finish()
{
MessageBox.Show("处理完成!");
}

2. 使用异步线程上下文 SynchronizationContext

       //UI线程的上下文
private SynchronizationContext mUIThreadSyncContext; public Form1()
{
InitializeComponent();
//初始化
mUIThreadSyncContext = SynchronizationContext.Current;
} private void btnStart_Click(object sender, EventArgs e)
{
//开启线程
new Thread(new ThreadStart(SubThread)).Start();
} //线程函数
private void SubThread()
{
for (int i = 0; i <= 100; i++)
{
//更新UI线程
mUIThreadSyncContext.Post(new SendOrPostCallback(SetProgress), i);
Thread.Sleep(100); //模拟耗时任务
}
mUIThreadSyncContext.Post(new SendOrPostCallback(Finish), null);
} private void SetProgress(object state)
{
this.progressBar.Value = Convert.ToInt32(state);
this.lblProgressText.Text = state.ToString() + "%";
} private void Finish(object state)
{
MessageBox.Show("处理完成!");
}

原文地址:https://blog.csdn.net/tongxin1004/article/details/80979043

Winform UI线程和处理线程交互(进度更新显示)的更多相关文章

  1. UI线程与worker线程

    也谈谈我对UI线程和worker线程的理解 UI线程又叫界面线程,能够响应操作系统的特定消息,包括界面消息.鼠标键盘消息.自定义消息等,是在普通的worker线程基础上加上消息循环来实现的,在这个消息 ...

  2. UI线程和工作者线程

    本文转载于:http://blog.csdn.net/libaineu2004/article/details/40398405 1.线程分为UI线程和工作者线程,UI线程有窗口,窗口自建了消息队列, ...

  3. Android的UI设计与后台线程交互

    本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行.本文还将阐述一些用户界面(UI)中与线程交互的API.UI用户界面 ...

  4. Winform软件,不要在线程里操作UI

    对于Winform软件,不要在线程里操作UI,不要相信:StartForm.CheckForIllegalCrossThreadCalls = false; 于是,把所有的代码都改成主线程委托调用的方 ...

  5. 使用线程新建WPF窗体(公用进度条窗体)

    使用线程新建窗体 项目中需要一个公用的进度条窗体.大家知道在wpf中,有两个线程,一个是UI线程,另一个是监听线程(一直监听用户的输入).如果我们后台有阻塞UI线程的计算存在,那么界面上的比如进度条什 ...

  6. C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)

           我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...

  7. C#新开一个线程取到数据,如何更新到主线程UI上面

       一:问题 之前有被面试官问过,在WinForm中,要去网络上获取数据,由于网络环境等原因,不能很快的完成,因此会发生进程阻塞,造成主进程假死的现象,需要怎么解决?    二:思路 因此,往往是新 ...

  8. 为什么说android UI操作不是线程安全的

    转载于:http://blog.csdn.net/lvxiangan/article/details/17218409#t2 UI线程及Android的单线程模型原则 使用Worker线程 Commu ...

  9. 由UI刷新谈到线程安全和Android单线程模型

    1.为什么说invalidate()不能直接在线程中调用? Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:A ...

  10. 后台子线程(非主线程)更新UI引起的警告

    一.问题描述 -(void)sendAsynchronousRequest { NSLog(@"%@",[NSThread currentThread]); [SVProgress ...

随机推荐

  1. spring ai 函数调用

    1.概要 我们使用AI大模型开发程序时,比如我需要查一下平台中有多少个客户.这个时候大模型肯定时不知道的,如果大模型不知道,他可能会回答不知道或者胡乱回答,这个时候就需要借助函数时调用来解决这些问题. ...

  2. uni-app 使用笔记

    1.前言 也不知道是我水平菜还是文档太烂,这个框架使用的过程中踩了无数的坑,屡次想砸键盘,最后贫穷让我平复了心情.为了纪念这段操蛋的日子,我决定把这些坑都记录下来. 2.数据请求 在实际的项目中,数据 ...

  3. .NET静态代码编织——肉夹馍(Rougamo)5.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...

  4. NFS服务搭建过程

    NFS服务 [1].nfs配置 作用: 解决数据一致性问题 NFS服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式书写,定义要共享的 ...

  5. 基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout

    1. PCB Layout 步骤 生成PCB 确定PCB layout规范 绘制板框尺寸 布局 布局规范: 按电气性能合理分区,一般分为:数字电路区(即怕干扰.又产生干扰).模拟电路区(怕干扰).功率 ...

  6. 在docker中使用主机串口通讯

    在进行软件docker化的过程时,很大的一个阻碍就是软件与各种外围硬件设备的交互,网口通信的设备能够很容易地接入容器,但是串口设备则要复杂一些.本文讨论在windows和linux下docker容器使 ...

  7. Qt音视频开发26-ffmpeg播放器

    一.前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件 ...

  8. ASP.NET Core 中的速率限制中间件的使用

    简介 在ASP.NET Core中,速率限制中间件是用来控制客户端对Web API或MVC应用程序发出请求的速率,以防止服务器过载和提高安全性. 下面是 AddRateLimiter 的一些基本用法: ...

  9. 查询 maven 依赖 的最新版本号

    如何通过maven官网查询相关依赖的具体代码和版本? 通过官网:http://mvnrepository.com/,或者:https://search.maven.org/ 在搜索栏中输入想要引入的依 ...

  10. 开源轻量级 IM 框架 MobileIMSDK 的微信小程序端已发布!

    一.基本介绍 MobileIMSDK - 微信小程序端是一套基于微信原生 WebSocket 的即时通讯库: 1)超轻量级.无任何第 3 方库依赖(开箱即用): 2)纯 JS 编写.ES6 语法.高度 ...