线程安全的Form.Show
我正在编写一个需要线程安全的Toast,因为它用于报告异步套接字输入的状态。 我试图让它保持线程安全,但祝酒词仍然锁定。
public static void Show( string message ) { Toast toast = new Toast( message ); toast.ShowAction(); } private delegate void InvokeCallback(); public void ShowAction() { if ( InvokeRequired ) { Invoke( new InvokeCallback( ShowAction ) ); } else { Show(); } }
我希望能够像消息框一样轻松地显示它们,即Toast.Show("Status changed");
。 任何帮助将不胜感激。
你的问题是Toast
正在另一个线程上创建。 您可能需要做的是在主UI线程上有一个“目标”,您可以在其中Invoke()
创建和显示Toast
,将所有UI保持在同一个线程上。
编辑
如果您需要能够将其保留在另一个线程上,那么您唯一的另一个选择是使用消息循环创建另一个线程。
Thread t = new Thread(); t.SetApartmentState(ApartmentState.STA) // Required for a UI thread
至于调度任务和消息到这个线程的实现,我会把它留给你。 您需要在它的开头调用Application.Run()
才能启动消息循环。
而且,与往常一样,您必须确保Invoke()
来自Toast(或此线程上的任何内容Invoke()
任何操作,这些操作可能与主UI线程交互。