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