2012-02-29 87 views
0

我有一个异步套接字客户端,当一个数据包到达时,我需要通过打开一个新窗体来处理它。如何从线程打开新窗体?

但是,因为它在一个线程中,新窗体挂起并且不响应。

如何创建并从异步回调中打开新表单?

+1

你需要把应用程序的主窗体的引用,因此异步回调可以调用它的BeginInvoke()方法并在UI线程上运行代码。您可以使用Application.OpenForms [0],但不建议这样做。 – 2012-02-29 12:10:15

回答

1

使用Dispatcher从背景切换到您的UI线程。

//This has to be done on the UI-Thread, before calling the async method 
var dispatcher = Dispatcher.CurrentDispatcher; 

//Now, in your async callback, do something like this 
private void AsyncCallback(IAsyncResult result){ 
    dispatcher.Invoke(new Action(() => 
    { 
     //Create your form Here   
    } 
} 

如果你希望你的后台线程等待,直到创建表格和图示,使用调用(),否则,使用开始

+0

调度员不存在于我的视觉工作室...你想让我把它放在哪里? – Basaa 2012-02-29 11:37:30

+0

您是否添加了对WindowsBase.dll的引用?忘了提到这一点。您需要在UI线程上获得对调度程序的引用,所以在调用任何异步操作之前在任何地方执行。也许在构造函数中? – Vertigo 2012-02-29 12:03:55