Как SendSync работает с пулом потоков - PullRequest
0 голосов
/ 13 апреля 2019

Question1:

Я отправляю сообщение, используя SendAsync:

https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.sendasync?view=netframework-4.7.2

Я отправляю большие электронные письма, и у меня слишком большая задержка в обратном вызове сообщения: client.SendCompleted

Письмо отправляется асинхронно, но обратный вызов выглядит как последовательный, кажется, что только один поток отправляет и получает электронные письма.

например. Если обратный вызов сообщения задерживается на 1 секунду, чтобы вернуться с почтовых серверов, и я отправляю 20 электронных писем, это задержит примерно 20 секунд для всех сообщений, которые будут доставлены и завершены.

Похоже, что есть только один поток, отправляющий сообщения в последовательную очередь ...

Если SendAsync внутренне имеет дело с пулом потоков, есть ли способ изменить количество потоков в этом пуле, max num threads и другие вещи, связанные с пулами потоков?

Вопрос2:

Еще один связанный вопрос о SendMailAsync: https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.sendmailasync?view=netframework-4.7.2

Внутренне SendMailAsync делает то же самое с SendAsync, несмотря на то, что дизайн кода немного отличается?

В чем реальная разница между SendAsync и SendMailAsync; это должно решить проблему, которую я имею в виду в вопросе 1?

КОД

Dim counter = 0

Public Async Function SendEmail(email As String, bodystuff As String) As Task
    Dim smtp As New SmtpClient() '"email-smtp.us-west-3.amazonaws.com")
    Dim hostloginpass = "email-smtp.us-west-3.amazonaws.com, AKDKJDAKJ2SKJMSDKJ2,AK2KD298;kdj2kjdkjaiuwkmp2KKK2098K2la97ksjNW,Test_Site"
    smtp.Host = cla_util.sGetToken(hostloginpass, 1, ",")
    smtp.Port = 587
    smtp.Credentials = New System.Net.NetworkCredential(getTokenFromArr(hostloginpass, 2, ","), getTokenFromArr(hostloginpass, 3, ","))
    smtp.EnableSsl = true

    Dim from As New MailAddress("contact@myserver.com", "Info", System.Text.Encoding.UTF8)
    Dim [to] As New MailAddress(email)
    Dim message As New MailMessage(from, [to])
    message.Body = String.Format("The message I want to send is to this <b>contact: {0}{1}</b>", vbCrLf, bodystuff)
    message.IsBodyHtml = True
    message.BodyEncoding = System.Text.Encoding.UTF8
    message.Subject = "Test email subject"
    message.SubjectEncoding = System.Text.Encoding.UTF8


    'commented -> Await smtp.SendMailAsync(message)
    smtp.SendMailAsync(message)

    counter = counter + 1

    System.Console.WriteLine("Counter -> " & counter)
End Function

Dim _isCompleted
Dim _timing

Dim Tasks As New ArrayList

Public Async Sub StartEmailRun()
    Try
        Dim sWatch As New Stopwatch()

        sWatch.Start()

        For i = 0 To 50
            Tasks.Add(SendEmail("a_test_email@gmail.com", "email test"))
        Next

        Console.WriteLine("SETP OUT OF THE SENDING")

        _isCompleted = True

        sWatch.Stop()
        _timing = sWatch.ElapsedMilliseconds

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Public Async Sub StartEmailRun2()
    Try
        Dim sWatch As New Stopwatch()

        sWatch.Start()

For i = 0 To 50
    Dim thread as New Thread(
      Sub() 
        SendEmail("a_test_email@gmail.com", "email test")
      End Sub
    )
    thread.Start()
Next

        Console.WriteLine("SETP OUT OF THE SENDING")

        _isCompleted = True

        sWatch.Stop()
        _timing = sWatch.ElapsedMilliseconds

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

1 Ответ

0 голосов
/ 18 апреля 2019

Проблема, я думаю, в том, что SmtpClient устарел:

https://docs.microsoft.com/pt-br/dotnet/api/system.net.mail.smtpclient?view=netframework-4.7.2

«SmtpClient не поддерживает многие современные протоколы. Он предназначен только для компатов. Он отлично подходит для рассылки электронных писем из инструментов, но не соответствует современным требованиям протокола.»

«Использовать MailKit или другие библиотеки.»

...