我正在编写一个需要线程安全的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");
。任何帮助将不胜感激。
答案 0 :(得分:1)
您的问题是Toast
正在其他线程上创建。您可能需要做的是在主UI线程上有一个“目标”,您可以Invoke()
创建和显示Toast
,保持所有UI在同一个线程上。
修改强>
如果你需要能够将它保留在另一个线程上,那么你唯一的另一个选择就是创建一个带有消息循环的另一个线程。
Thread t = new Thread();
t.SetApartmentState(ApartmentState.STA) // Required for a UI thread
关于调度任务和消息到这个线程的实现,我会把它留给你。您需要在其开头调用Application.Run()
才能启动消息循环。
而且,与往常一样,您必须确保Invoke()
可能与主UI线程交互的Toast(或此线程上的任何内容)中的任何操作。