zoukankan      html  css  js  c++  java
  • Winform跨线程操作界面的策略

    BeginInvoke(new ThreadStart(() => toolStripButton1.Text = "aaa"));

    1、非跨线程操作和部分跨线程get不会引发异常;

    2、跨线程set,见上面的例子。

    3、部分跨线程get,见下面的例子。

    var a = (int)EndInvoke(BeginInvoke(new Func<int>(() => toolStripComboBox1.SelectedIndex)));
    public static class UIInvokeHelper
    {
        public static void InvokeUI(this Form form, Action action)
        {
            if (form == null)
            {
                throw new ArgumentNullException("form");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            if (form.InvokeRequired)
            {
                form.Invoke(new Action(action), null);
            }
            else
            {
                action();
            }
        }
        public static T InvokeUI<T>(this Form form, Func<T> func)
        {
            if (form == null)
            {
                throw new ArgumentNullException("form");
            }
            if (func == null)
            {
                throw new ArgumentNullException("func");
            }
            if (form.InvokeRequired)
            {
                return (T)form.Invoke(new Func<T>(func));
            }
            return func();
        }
    }
    public static class UIInvokeHelper
    {
        /// <summary>
        /// 适用于非耗时、无返回值的跨线程界面操作。
        /// </summary>
        /// <param name="form"></param>
        /// <param name="action"></param>
        public static void InvokeUI(this Form form, Action action)
        {
            if (form == null)
            {
                throw new ArgumentNullException("form");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            if (form.InvokeRequired)
            {
                form.Invoke(new Action(action));
            }
            else
            {
                action();
            }
        }
        /// <summary>
        /// 适用于有返回值的跨线程界面操作。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="form"></param>
        /// <param name="func"></param>
        /// <returns></returns>
        public static T InvokeUI<T>(this Form form, Func<T> func)
        {
            if (form == null)
            {
                throw new ArgumentNullException("form");
            }
            if (func == null)
            {
                throw new ArgumentNullException("func");
            }
            if (form.InvokeRequired)
            {
                return (T)form.Invoke(new Func<T>(func));
            }
            return func();
        }
        /// <summary>
        /// 适用于耗时、无返回值的跨线程界面操作。
        /// </summary>
        /// <param name="form"></param>
        /// <param name="action"></param>
        public static void BeginInvokeUI(this Form form, Action action)
        {
            if (form == null)
            {
                throw new ArgumentNullException("form");
            }
            if (action == null)
            {
                throw new ArgumentNullException("action");
            }
            if (form.InvokeRequired)
            {
                form.BeginInvoke(new Action(action));
            }
            else
            {
                Task.Factory.StartNew(action);
            }
        }
    }
  • 相关阅读:
    【leetcode_easy_greedy】1403. Minimum Subsequence in Non-Increasing Order
    【leetcode_easy_sort】1030. Matrix Cells in Distance Order
    word2010 标题编号
    WORD2013中如何使用多级列表自动编号(转)
    Javaweb权限管理设计思路 (转)
    前后端分离模式下的权限设计方案 (转)
    Axure rp8.1.0.3381 3382 激活码(2019-07-26 亲测可用) 转
    通达OA开发网址
    C# Winform 跨线程更新UI控件常用方法汇总 (转)
    C#中的Invoke
  • 原文地址:https://www.cnblogs.com/yao2yao4/p/3180543.html
Copyright © 2011-2022 走看看