在UI线程上异步执行Action,不阻止在调用线程上执行。

        /// <summary>
        /// Executes the Action asynchronously on the UI thread, does not block execution on the calling thread.
        /// </summary>
        /// <param name="control">the control for which the update is required</param>
        /// <param name="action">action to be performed on the control</param>
        public static void InvokeOnUiThreadIfRequired(this Control control, Action action)
        {
            //If you are planning on using a similar function in your own code then please be sure to
            //have a quick read over https://stackoverflow.com/questions/1874728/avoid-calling-invoke-when-the-control-is-disposed
            //No action
            if (control.Disposing || control.IsDisposed || !control.IsHandleCreated)
            {
                return;
            }

            if (control.InvokeRequired)
            {
                control.BeginInvoke(action);
            }
            else
            {
                action.Invoke();
            }
        }

 调用

 this.InvokeOnUiThreadIfRequired(() => backButton.Enabled = canGoBack);//canGoBack为bool
this.InvokeOnUiThreadIfRequired(() => statusLabel.Text = args.Value);

 

posted @ 2022-12-01 15:31  蓝瑟黄昏  阅读(34)  评论(0编辑  收藏  举报