线程安全的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线程交互。