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

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

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. 【架构】整理了一份通用的MVP框架示例代码

    最近回顾了一下MVP框架,结合阅读到的几篇不错的博客,自己整理了一份可用于实际工作的MVP框架示例代码,这里做个记录,也顺便和网友们分享一下. 代码示例演示的是一个输入员工号查询员工信息并显示的场景, ...

  2. 实现不可逆加密文件:探索 GodoOS 的安全机制

    在当今数字化时代,数据安全成为了企业和个人关注的重点.为了保护敏感信息不被未授权访问,各种加密技术应运而生.本文将探讨 GodoOS 项目中实现的一种不可逆加密文件的方法,重点介绍其背后的原理和技术细 ...

  3. 【分块】LibreOJ 6277 数列分块入门1

    前言 分块是一种优雅的暴力,将数组按块长 \(\sqrt{n}\) 进行分块,可实现区间加法.区间求和和区间逆序对计数等场景,进行 \(m\) 次操作的时间复杂度:\(O(m\sqrt{n})\). ...

  4. 中电金信:ChatGPT一夜爆火,知识图谱何以应战?

              随着ChatGPT的爆火出圈     人工智能再次迎来发展小高潮      那么作为此前搜索领域的主流技术          知识图谱前路又将如何呢?   事实上,ChatGPT也 ...

  5. 【人工智能】【Python】Numpy基础

    Numpy 目录 Numpy Numpy简介 ndarray与原生Python List运算效率对比 N阶数组 ndarray (1)创建数组 (2)生成数组 生成纯1数组 生成纯0数组 从现有数组生 ...

  6. jenkins异常 -- active (exited),无法启动

    一.问题描述 1.无法启动 systemctl start jenkins 没有反应,没有输出报错 2.查询状态 systemctl status jenkins 3.jenkins拒绝访问 二.解决 ...

  7. Qt编写物联网管理平台35-实时曲线

    一.前言 设备采集到的数据,通过曲线展示也是一种非常好的方式,尽管之前已经有了表格数据展示.设备面板展示.设备地图展示等,实时曲线也是一种不错的方式,这个用户自由选择,反正通过端口已经拿到了所有要采集 ...

  8. cmake错误:CMake Error: CMake can not determine linker language for target

    解决方案:因为你的library只有头文件,没有cpp文件 在add_library中增加cpp文件 同时建立一个空的cpp文件即可. 处理后的源代码结构和CMakeLists.txt内容如下所示: ...

  9. 《Hough变换及其在信息处理中的应用》电子书下载

    <Hough变换及其在信息处理中的应用>电子书下载:百度云盘,  提取码:9zyi

  10. Android Studio中使用Java+OpenGL ES创建Android项目

    首先是使用android studio生成空白的模板文件,包含一个MainActivity文件, 在onCreate方法中参照如下注释进行修改: package com.example.wang.an ...