首页 > 编程语言 > 详细

Winform UI线程和处理线程交互(进度更新显示)

时间:2020-09-23 20:56:30      阅读:56      评论:0      收藏:0      [点我收藏+]

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

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

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线程和处理线程交互(进度更新显示)

原文:https://www.cnblogs.com/runningRain/p/13719711.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!