多线程更新GUI-OnUIThread

在UI线程上异步执行操作,不阻塞在调用线程上的执行。

WPF更新

using System.Windows.Controls;
        public static void OnUIThread(this Control control, Action action)
        {
            if (control.Dispatcher.CheckAccess())
            {
                control.Dispatcher.BeginInvoke(action);
            }
            else
            {
                control.Dispatcher.Invoke(action);
            }
        }
    this.OnUIThread(() => btn.IsEnabled = true);

此方法多用于UI更新。若需要与主线程(UI线程)同步时,则直接使用Dispatcher.Invoke执行,比如多线程读取UI控件的值。

Application 类型的实例在初始化之前,Dispatcher 属性就已经被赋值且不为 null;
任何与 Application 不在同一个线程的代码,都可能遭遇 Application.Current 为 null。
当应用程序退出时,所有 UI 线程的代码都不再会执行,因此这是安全的;但所有非 UI 线程的代码依然在继续执行,此时随时可能遇到 Application.Current 属性为 null。

WinForm更新

using System.Windows.Form;
    public static void OnUIThread(this Control control, Action code)
    {
        if (control.InvokeRequired)
        {
            control.BeginInvoke(code);
        }
        else
        {
            code.Invoke();
        }
    }

Prism更新

using Prism.Wpf;
/// <summary>
/// 在UI线程上异步执行操作,不阻塞在调用线程上的执行。
/// </summary>
/// <param name="control"></param>
/// <param name="action"></param>
public static void OnUIThread(this Prism.Mvvm.BindableBase bindableBase, Action action)
{
    SynchronizationContext.Current.Post((o) =>
    {
        action();
    }, null);
}
posted @ 2019-12-31 18:08  wesson2019  阅读(496)  评论(0编辑  收藏  举报