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

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

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. Python 学习记录 (4)

    Plotly常见可视化方案:以鸢尾花数据为例 简单介绍: Ploty库也有大量统计可视化方案,并且这些可视化方案具有交互化属性. 主要对鸢尾花数据进行处理与可视化. 所展示的结果为交互界面的截图情况, ...

  2. 案例 | 销讯通加持药企SFE部门效能提升

    为了获取更大的市场空间,医药健康行业正迎来一波前所未有的产业升级.尽管不少企业取得了许多成绩,但仍面临诸多挑战. 江苏某制药公司在心脑血管.中枢神经.胃肠内科.心脏科.内分泌科.皮肤科和风湿科等领域均 ...

  3. manim边做边学--图形的创建与销毁

    上一篇介绍了文字相关的创建和销毁动画,本篇介绍几个用于几何图形的创建和销毁动画效果类. Create:用于在场景中生成一个完整的Mobject(可渲染对象) Uncreate:是Create的逆操作, ...

  4. windows版 nvm 1.1.7 安装(填坑)

    参考https://www.jianshu.com/p/cbf4f76ba0bb安装,注意事项: 1. 最好下载Setup安装版本,带安装界面,这样可以填写安装路径以及Nodejs路径,省去了改文件的 ...

  5. ArkTs布局入门03——层叠布局(Stack)

    1.概述 叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局.层叠布局通过Stack容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈, ...

  6. 二进制安装Kubernetes(k8s)v1.32.0

    二进制安装Kubernetes(k8s)v1.32.0 介绍 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 kubernetes(k ...

  7. Shiro简单入门+个人理解(3)

    最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了 Shiro的授权: 授权:对用户资源访问的授权(是否允许用户访问此资源) 用户访问系统资源时的 ...

  8. Qt开源作品44-超级曲线图表

    按照国际惯例,先吹吹牛,QCustomPlot这个开源图表组件,作者绝对是全宇宙Qt领域的天花板,设计的极其巧妙和精美,各种情况都考虑到了,将每个功能细分到不同的类,每个类负责管理自己的绘制和各种属性 ...

  9. Ubuntu安装宝塔服务

    Linux面板7.9.4安装脚本 查看详细安装教程 使用 SSH 连接工具,如 堡塔SSH终端 连接到您的 Linux 服务器后, 挂载磁盘 ,根据系统执行相应命令开始安装(大约2分钟完成面板安装): ...

  10. Pytorch Layer层总结

    卷积层 nn.Conv1d 对由多个输入平面组成的输入信号应用一维卷积. nn.Conv2d 在由多个输入平面组成的输入信号上应用 2D 卷积. nn.Conv3d 对由多个输入平面组成的输入信号应用 ...