zoukankan      html  css  js  c++  java
  • 跨线程的安全更新控件

    在你的工程中的扩展方法类中写下一个SafeCall方法:
    using System;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public static class Extensions
        {
            public static void SafeCall(this Control ctrl, Action callback)
            {
                if (ctrl.InvokeRequired)
                    ctrl.Invoke(callback);
                else
                    callback();
            }
        }
    }
    它只是把你要保护起来的代码作为一个回调而已。然后任何需要保护一些代码的地方都可以这样调用:
    using System;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(h =>
                {
                    for (var i = 0; i < 10000000; i++)
                    {
                        label1.SafeCall(() =>
                        {
                            label1.Text = i.ToString();
                        });
                        Thread.Sleep(100);
                    }
                });
            }
     
        }
    }
    当然,使用lamda是我的一个“坏毛病”。其实这里完全可以使用传统的匿名委托写法:
    
    using System;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(h =>
                {
                    for (var i = 0; i < 10000000; i++)
                    {
                        label1.SafeCall(delegate()
                        {
                            label1.Text = i.ToString();
                        });
                        Thread.Sleep(100);
                    }
                });
            }
     
        }
    }
  • 相关阅读:
    如何用ps简单快速扣头发丝
    thinkphp在iis上不是出现500错误
    PHP数组函数详解大全
    一个搜图的好网站
    手把手编写PHP MVC框架实例教程
    centos配置epel和remi源
    CentOS 7 yum 安装php5.6
    20162322 朱娅霖 作业005&006 栈,队列
    2017-2018-1 bug终结者 团队博客002
    2017-2018-1 bug终结者 团队博客001
  • 原文地址:https://www.cnblogs.com/51net/p/3994538.html
Copyright © 2011-2022 走看看