VisualElement注册回调

public void RegisterCallback<TEventType>( EventCallback<TEventType> callback, TrickleDown useTrickleDown = TrickleDown.NoTrickleDown) where TEventType : EventBase<TEventType>, new() public void RegisterCallback<TEventType, TUserArgsType>( EventCallback<TEventType, TUserArgsType> callback, TUserArgsType userArgs, TrickleDown useTrickleDown = TrickleDown.NoTrickleDown) where TEventType : EventBase<TEventType>, new()

TEventType是一种缩写,它表示EventBase<TEventType>TEventType : EventBase<TEventType>

自定义事件

private void CreateGUI() { var l = new Label("one"); l.RegisterCallback<MyEvent>(e => { }); rootVisualElement.Add(l); } class MyEvent : EventBase<MyEvent> { }

在一个线程里面执行任务,任务执行结束之后,把事件返回给UI线程

核心在于使用SynchronizationContext mainThreadSyncContext;把主线程的上下文保存下来,然后执行post。
通过Thread.CurrentThread.ManagedThreadId查看线程ID,发现确实是符合预期。

public class ValueCallback { private Action<string> act; public string data; SynchronizationContext mainThreadSyncContext; public ValueCallback() { mainThreadSyncContext = SynchronizationContext.Current; } public void OnValue(Action<string> act) { if (data != null) { act.Invoke(data); return; } this.act = act; } public void Call(string value) { this.data = value; //设置data供以后可能会用到 if (this.act != null) { //如果在主线程中更新样式和 mainThreadSyncContext.Post(_ => { Debug.Log($"=========POST内部:{Thread.CurrentThread.ManagedThreadId} {value}"); this.act.Invoke(value); }, null); } } }

runInUIThread

static SynchronizationContext mainThreadSyncContext; static void runInUIThread(Action act) { mainThreadSyncContext.Post(_ => { act(); }, null); }

C#中的线程池

ThreadPool.QueueUserWorkItem((o) => { var p = Process.Start(file, arguments); p.StartInfo.UseShellExecute = false; p.StartInfo.StandardOutputEncoding = Encoding.UTF8; p.StartInfo.RedirectStandardOutput = true; var res = p.Start(); p.WaitForExit(); var content = p.StandardOutput.ReadToEnd(); callback.Invoke(content); });

自定义事件

private void CreateGUI() { var value = 1; var l = new Label("one"); l.RegisterCallback<MyEvent>(e => { l.text = $"{value}"; }); rootVisualElement.Add(l); var b = new Button(() => { l.SendEvent(new MyEvent()); }); b.text = "点我加一"; rootVisualElement.Add(l); rootVisualElement.Add(b); } class MyEvent : EventBase<MyEvent> { }