Использование объекта из другого потока - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Приветствую, граждане. Не являюсь программистом и не собираюсь им становиться. Лишь ИЗРЕДКА что-то пишу для собственных бытовых нужд. Поэтому прошу не отправлять читать статьи и всякие талмуды. Признаюсь, мне, в идеале, нужен тупо ответ), а не наталкивание на мысли) В программе моей классическая беда, наталкивающая на необходимость использования нескольких потоков. Почитал об этом, но в статейных мелких примерах не рассматривается подобный случай. И у меня чисто логический затык. Прошу разъяснить. Работаю с TCPClient'ом В определённой процедуре делаю:
Но вот если по каким-то причинам на той стороне никто не отвечает, прога висит секунд 15. Конечно хочется засунуть client.Connet в другой процесс. Что я и попробовал и, как и ожидал, результата не получил. Я так понимаю, другой процесс - это как параллельная вселенная)) если там выполняешь коннект, то там вроде как и работай) Как же мне всё-таки ВОЗМОЖНО-виснущую команду коннекта запихать в другой процесс и потом с ней работать? Я где-то чо-то явно не понимаю) И сразу же второй вопрос. Делегаты. В тех примерах, которые я находил в инете, рассматривается всегда случай необходимости использования одного объекта другого потока и одного его метода (TextBox1.Text = ... или вроде того). А что мне делать со всем моим сопутствующим барахлом, что вы видите в коде? Для каждого делать свой делегат и процедуру делегата?? В это я не могу поверить. Наверняка существует какое-то элегантное решения "межвселенского" общения. Не подскажете? Буду очень спасибо говорить)

Решение задачи: «Использование объекта из другого потока»

textual
Листинг программы
  Public client As System.Net.Sockets.TcpClient
    Delegate Sub _Dlgt()
 
    Sub TryConnect()
        client = New System.Net.Sockets.TcpClient
        'отправляеи запрос в асинхронный поток подключения, который ни как не повляет на работу основного потока
        client.BeginConnect("адрес", порт, New System.AsyncCallback(AddressOf AConnect), client)
    End Sub
 
    Sub AConnect(ByVal asyncResult As IAsyncResult)
        'вызов AConnect происходит в конце попытки подключения
        'здесь без всяких разборов результата происход вызов Invoke формы в основной поток
        Me.Invoke(New _Dlgt(AddressOf ConnectFinish))
    End Sub
 
    Sub ConnectFinish()
        'проверяем состояние
        If client.Connected Then
            'если есть подключение...
        Else
            'если нет
        End If
    End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы