多线程更新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);
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号