Я разработал клиент сокета async, после подключения я вызываю эту процедуру OnConnect.ошибка при вызове winform в процедуре onconnect
Цель состоит в том, чтобы установить текст состояния в главном окне на «подключен», а затем показать диалоговое окно входа в систему для пользователя
Friend Sub OnConnect(ByVal ar As IAsyncResult)
Try
oSocket.EndConnect(ar)
MainDialog.SetStatus("Connected") <-- this line is giving the error
'We are connected so start listening for messages
byteData = New Byte(1023) {}
'Start listening to the data asynchronously
oSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnReceive), Nothing)
'// show login dialog
loginDlg = New LoginDialog
loginDlg.ShowDialog()
Catch ex As Exception
ShowMessage(String.Format(My.Resources.error_failed_reason, "connect", "server", ex.Message), MessageBoxIcon.Information)
End Try
End Sub
, но я получаю исключение
An возникла ошибка при создании формы. См. Exception.InnerException для . Ошибка: Текущий поток должен быть установлен на один поток (STA) до того, как вызовы OLE могут быть сделаны. Убедитесь, что ваша основная функция имеет отмеченный на ней STAThreadAttribute.
Я не использую любую тему, только асинхронное гнездо
, что может быть причиной этой ошибки? - это OnConnect, вызываемый в другом потоке?
EDIT
Я просто сделал свою заявку один поток, добавив этот
Public Class Program
<STAThread()> _
Shared Sub Main()
Dim frm As New MainDialog
Application.Run(frm)
End Sub
End Class
EDIT 2
я заменил эту строку
MainDialog.SetStatus("Connected")
С этой линией
If MainDialog.InvokeRequired Then <-- This line gives the same error as above
MainDialog.Invoke(New LoginDelegate(AddressOf ShowLogin), "Connected")
End If
Я создал этот делегат в модуле выше
Private Delegate Sub LoginDelegate(ByVal Item As Object)
На какой именно линии вы получаете исключение? – bokibeg
в этой строке 'MainDialog.SetStatus (« Connected ») <- эта строка дает ошибку' – Smith
Перечитываю вопрос сейчас, я пропустил его сначала :).Вам просто нужно установить атрибут 'STAThread', как предложил Lajos, и он должен работать нормально. Скажите нам, если это не решит проблему. Это может быть то, что событие запускается из другого потока, в этом случае вам нужен diff. решение. – bokibeg