using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Serein.Library.Utils { /// /// 为类库提供了在UI线程上下文操作的方法(使用Serein.Workbench时不用处理) /// 在WPF、Winform项目中,多线程中直接操作UI线程可能发生非预期的异常 /// 所以当你设置自己的平台时,需要手动实例化这个工具类 /// public class UIContextOperation { private SynchronizationContext context; private readonly Func getUiContext = null; static UIContextOperation() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { } } /// /// 传入UI线程上下文 /// /// 线程上下文 public UIContextOperation(SynchronizationContext synchronizationContext) { this.context = synchronizationContext; } /// /// 传入UI线程上下文 /// /// 线程上下文 public UIContextOperation(Func getUiContext) { this.getUiContext = getUiContext; } /// /// 同步方式进行调用方法 /// /// 要执行的UI操作 public void Invoke(Action uiAction) { if(context is null && getUiContext != null) { context = getUiContext.Invoke(); } context?.Post(state => { uiAction?.Invoke(); }, null); } /// /// 异步方式进行调用 /// /// 要执行的UI操作 /// public Task InvokeAsync(Action uiAction) { if (context is null && getUiContext != null) { context = getUiContext.Invoke(); } var tcs = new TaskCompletionSource(); context?.Post(state => { try { uiAction?.Invoke(); tcs.SetResult(true); } catch (Exception ex) { tcs.SetException(ex); } }, null); return tcs.Task; } } }