线程安全的Form.Show

时间:2009-04-24 18:25:05

标签: c# winforms multithreading

我正在编写一个需要线程安全的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");。任何帮助将不胜感激。

1 个答案:

答案 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(或此线程上的任何内容)中的任何操作。