powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Корректно ли запускаю поток с кучей параметров и дожидаюсь его завершения?
4 сообщений из 4, страница 1 из 1
Корректно ли запускаю поток с кучей параметров и дожидаюсь его завершения?
    #38962144
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил таки поиграться с потоком на простом примере. Вроде все получилось но решил проконсультироваться.

Задача такая. Есть ф-ция тестирования pop3 сервера:
Код: vbnet
1.
2.
3.
4.
5.
  Public Sub GetMail(ByVal m_PopServer As String, ByVal m_User As String, ByVal m_Password As String, _
   Optional ByVal m_ServerPort As Integer = 110, Optional ByVal m_useSSL As Boolean = False, _
   Optional ByVal m_DeleteEmails As Boolean = True, Optional ByVal m_SaveDir As String = vbNullString, _
   Optional ByVal m_SaveMailPrefix As String = "MSG", Optional ByVal m_SaveMailExt As String = ".eml", _
   Optional ByVal m_TraceFunction As Pop3.TraceHandler = Nothing, Optional ByVal m_TestMode As Boolean = False)


С параметром m_TestMode=True она просто делает тест: типа коннектится к серверу, дает какие-то команды типа STAT, LIST, NOOP, потом дисконнектится.
m_TraceFunction -отвечает за вывод куда скажу.

Чего хочу 1) запустить GetMail в отдельном потоке, чтоб не блочила в частности вывод процесса 2) выводить результат в TextBox на форме 3) Чтоб форму нельзя было закрыть, пока GetMail работает(макс. таймаут=60сек, если совсем жо*а) 4) Разрешить закрыть форму по завершению работы

Собственно вот чего получилось:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Imports System.Threading

Public Class frmTestPop3

  Dim DoNotCloseMe As Boolean = True 'не закрывать крестиком или по Alt+F4

...

  Private Sub frmTestPop3_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    'запрет закрытия через крестик, Alt+F4 и т.п. (но при этом Me.Close() также не работает)
    If DoNotCloseMe AndAlso e.CloseReason = CloseReason.UserClosing Then e.Cancel = True
  End Sub

  Private Sub frmTestPop3_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    Dim MailPop3Thread As Thread = New Thread(AddressOf MailPop3ThreadFunction)
    With FormMain
      MailPop3Thread.Start({.TextBoxMailPOP3Server.Text, .TextBoxMailPOP3Login.Text, .TextBoxMailPOP3Password.Text, _
       CType(Val(.ComboBoxMailPOP3Port.Text), Integer), .CheckBoxMailPOP3ssl.Checked})
    End With
  End Sub

  Private Sub MailPop3ThreadFunction(ByVal param As Object())
    GetMail(CType(param(0), String), CType(param(1), String), CType(param(2), String), _
     CType(param(3), Integer), CType(param(4), Boolean), False, , , , AddressOf AddTrace, True)
    Me.Invoke(New EnableExitDelegate(AddressOf EnableExit)) 'разрешаем закрыть форму по завершении
  End Sub

  Private Sub AddTrace(ByVal str As String)
    Me.Invoke(New AddToDebugDelegate(AddressOf AddToDebug), str)
  End Sub

  Private Delegate Sub AddToDebugDelegate(ByVal str As String)

  Private Sub AddToDebug(ByVal strDebug As String)
    Me.TextBoxTrace.Text = Me.TextBoxTrace.Text & strDebug & vbCrLf
    Me.TextBoxTrace.SelectionStart = Strings.Len(Me.TextBoxTrace.Text)
    Me.TextBoxTrace.ScrollToCaret()
  End Sub

  Private Delegate Sub EnableExitDelegate()

  Private Sub EnableExit()
    Me.ButtonClose.Enabled = True
    DoNotCloseMe = False
    LabelWait.Visible = False
  End Sub
...
End Class 



1) Корректно ли я стартую "поток с параметрами"?
2) Корректно ли я передаю параметры? Я использую массив param As Object(),
при этом Object-ы разнородные: String, Integer, Boolean - эдакая каша.
3) Корректно ли я делаю Invoke-и в вызывающий поток. Я их делаю (1) чтоб писать Trace в текстбокс, (2) чтоб выполнить действия по завершению потока, а именно разрешить закрыть форму.
4) Могу ли я быть уверен что поток сразу завершится после Me.Invoke(New EnableExitDelegate(AddressOf EnableExit)),
грубо я из-под потока делаю действия которые по-хорошему должны быть сделаны сразу после его завершения.
(Я пробовал делать .Join после .Start но получил мертвый висяк на всегда, да и не хочу я форму полностью блочить, заблочить бы ее конечно можно было и без потока, но при этом страдает качество непрерывного вывода протокола событий в TextBox).
...
Рейтинг: 0 / 0
Корректно ли запускаю поток с кучей параметров и дожидаюсь его завершения?
    #38962152
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) Корректно ли я стартую "поток с параметрами"?Если есть возможность лучше использовать асинхронные операции, чем создавать поток самому. Для управления асинхронными операциями удобно использовать Task+async+await.
...
Рейтинг: 0 / 0
Корректно ли запускаю поток с кучей параметров и дожидаюсь его завершения?
    #38962158
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кесть возможность лучше использовать асинхронные операции
Допустим. А у меня в этом примере такая возможность есть?
В System.Net.Mail например есть .Send, а есть .SendAsinc, но это "штатный .Net класс", не знаю как он устроен.
CallBack то конечно штука хорошая.
А здесь "моя" функция.
И как сказанное соотносится с совместимостью с .Net2 (коей я пока строго придерживаюсь, дальше видно будет).
...
Рейтинг: 0 / 0
Корректно ли запускаю поток с кучей параметров и дожидаюсь его завершения?
    #38962181
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Алексей Кесть возможность лучше использовать асинхронные операции
Допустим. А у меня в этом примере такая возможность есть?
В System.Net.Mail например есть .Send, а есть .SendAsinc, но это "штатный .Net класс", не знаю как он устроен.MSDN? :-)
Дмитрий77CallBack то конечно штука хорошая.
А здесь "моя" функция.Ну обычно "моя функция" и указывается в качестве callback. :-)
Дмитрий77И как сказанное соотносится с совместимостью с .Net2 (коей я пока строго придерживаюсь, дальше видно будет).Task появился в .Net 4.
async/await появился в .Net 4.5

Без них работать с асинхронностями очень неудобно.

В .Net 2 BackgroundWorker может помочь.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Корректно ли запускаю поток с кучей параметров и дожидаюсь его завершения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]