2012-02-29 3 views
0

У меня есть клиент сокета async, и когда пакет прибывает, мне нужно обработать его, открыв новую форму.Как открыть новую форму из темы?

Однако, поскольку это в потоке, новая форма висит и не отвечает.

Как создать и открыть новую форму из асинхронного обратного вызова?

+1

Вам нужна ссылка на главной форму приложения так асинхронный обратный вызов может позвонить его метод BeginInvoke() и запустить код в потоке пользовательского интерфейса. Вы можете использовать Application.OpenForms [0], но это не рекомендуется. –

ответ

1

Используйте диспетчер, чтобы переключиться с фона на поток пользовательского интерфейса.

//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   
    } 
} 

Если вы хотите, чтобы ваш фоновый поток ждать, пока форма не будет создана и показана, использовать Invoke(), иначе, использование Begin

+0

Dispatcher не существует в моей визуальной студии ... Где именно вы хотите, чтобы я это сказал? – Basaa

+0

Вы добавили ссылку на WindowsBase.dll? Забыл упомянуть об этом. Вам нужно получить ссылку на диспетчера в потоке пользовательского интерфейса, так что сделайте это где угодно, прежде чем вы будете вызывать что-либо async. Может быть, в конструкторе? – Vertigo