powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
25 сообщений из 48, страница 1 из 2
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851947
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь идет об SmtpClient из System.Net.Mail.
Метод client.Send(message) все таки очень мерзопакостно завешивает вызывающий поток. (CDO кстати ТАК не завешивает!!!)
Ну собственно они и рекомендуют сlient.SendAsync(message, "userToken")
Что на пальцах выглядит так:
Код: 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.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
      Dim client As New SmtpClient()
...
      Dim message As New MailMessage()
...
      AddHandler client.SendCompleted, AddressOf SendCompletedCallback
      client.SendAsync(message, "userToken")
    Catch
      MsgBox(Err.Description)
    End Try
  End Sub

  Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    ' Get the unique identifier for this asynchronous operation. 
    Dim token As String = CStr(e.UserState)

    If e.Cancelled Then
      MsgBox("Send canceled.")
    End If
    If e.Error IsNot Nothing Then
      MsgBox(e.Error.Message, , token)
    Else
      MsgBox("Message sent.")
    End If
  End Sub



Что я хочу. Указать SendCompletedCallback в качестве параметра к общей ф-ции SendMailMessage, которую для себя накатал.( 17103116 )
Использовать какую-то "общую" SendCompletedCallback я не могу, т.к. в ней идет обработка результата отправки, что зависит от задачи.

Т.е. я пытаюсь сделать вот это:
Код: 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.
Public Function SendMailMessage(Optional ByVal m_msg_FromAddress As String = vbNullString,
...
                                  Optional ByVal m_CallbackFunction As [Delegate] = Nothing,
                                  Optional ByVal m_emailToken As String = vbNullString,
                                  Optional ByRef str_error As String = vbNullString
                                  ) As Boolean

          If IsNothing(m_CallbackFunction) Then
            AddLogCDO(Now.ToString & Chr(9) & "Sending mail")
            .Send(message)
            AddLogCDO(Now.ToString & Chr(9) & "Sending mail...Done")
            AddLogCDO("-------------------------")
            Return True
          Else
            AddLogCDO(Now.ToString & Chr(9) & "Sending mail asynchronously")
            AddLogCDO(Chr(9) & Chr(9) & "Token=" & m_emailToken)
            AddHandler client.SendCompleted, m_CallbackFunction
            .SendAsync(message, m_emailToken)
            AddLogCDO(Now.ToString & Chr(9) & "Sending mail asynchronously...waiting for the result")
            AddLogCDO("-------------------------")
            Return True
          End If
...
    If SendMailMessage("sender@hotmail.com",...
     ..."smtp.live.com", 567, True, "sender@hotmail.com", "password", True, False, AddressOf SendCompletedCallback, , str_err) ...


?1.Нижняя выделенная строчка ругается. Понятно что написал хрень, но смысл чего хочу понятен. Как правильно передать SendCompletedCallback в SendMailMessage?

Второй видимый вариант решения.
По хорошему мне бы вернуть конечный OK/str_error из самой SendMailMessage.

?2.Возможно ли грамотно реализовать что-то типа???:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function SendMailMessage(...
...
            AddHandler client.SendCompleted, AddressOf SendCompletedCallback
            .SendAsync(message, m_emailToken)
            AddLogCDO(Now.ToString & Chr(9) & "Sending mail asynchronously...waiting for the result")
            Do
               If (есть результат в SendCompletedCallback) Then Exit Do
               Application.DoEvents() 'чтоб она не "вешала" форму, и именно поэтому .Send(message) не катит
            Loop
            return true/[false + str_error ]
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851967
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

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

Без использования BackgroundWorker а хотябы это не получится. Все поднявшиеся эвенты вызваю любые обработчики в том же потоке.

А когда вы начнете разбираться с многопоточностью, то и обратный вызов будет выглядеть по-другому...
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851973
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

.SendAsync -я вот даже не заметил.
:-(
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851976
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Без использования BackgroundWorker а хотябы это не получится. Все поднявшиеся эвенты вызваю любые обработчики в том же потоке.

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

async/away
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851977
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: vbnet
1.
return true/[false + str_error ]



ну и жестянство
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851979
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttD129Без использования BackgroundWorker а хотябы это не получится. Все поднявшиеся эвенты вызваю любые обработчики в том же потоке.

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

async/away он под .net 2.0 пишет
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851980
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Да вроде все правильно. Может у вас просто тип делегата (количество параметров) не совпадает?
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851984
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Как ругается - тоже бы неплохо было узнать.
:-)
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38851999
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAон под .net 2.0 пишет

печалька²
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852017
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129,

>Да вроде все правильно. Может у вас просто тип делегата (количество параметров) не совпадает?
Да, давайте лучше состедоточимся на вопросе о том как передать CallBack ф-цию в качестве параметра отбросив критику архитектуры и т.п. Хотя, я понимаю что всякие AdressOf -это VB-specific синтаксисы.
>Как ругается - тоже бы неплохо было узнать.
Если в коде в точности как я привел, то компилятор подчеркивает и пишет
Выражение AddressOf нельзя преобразовать в "System.Delegate", поскольку тип "System.Delegate" объявлен с модификатором MustInherit и не может быть создан.
Ну, я просто не знаю приема как это правильно делается.
М.б. как то надо
Private Delegate Function CallBackDelegate...
объявить, вопрос то скорее технически-синтаксический как это все оформить

>он под .net 2.0 пишет
Я под .Net 4.5 делаю. Но контролирую совместимость относительно .Net 2.0 и относительно x86/x64. И кое-что приходится подправлять после этих проверок. Нельзя на Net 4.5 закладываться пока XP еще живо.

>return true/[false + str_error ]
>ну и жестянство
не придирайся. Речь шла всего-лишь о том чтобы вернуть конечный результат из самой ф-ции а не из CallBack

>BackgroundWorker,разбираться с многопоточностью
Я счас не ставлю вопрос об этом

В примитиве Application.DoEvents() достаточно, чтобы не вешать.

CDO.Message.Send() кстати не вешает форму
а System.Net.Mail.SmtpClient.Send() (без Async) -вешает
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852041
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77>он под .net 2.0 пишет
Я под .Net 4.5 делаю. Но контролирую совместимость относительно .Net 2.0 и относительно x86/x64. И кое-что приходится подправлять после этих проверок. Нельзя на Net 4.5 закладываться пока XP еще живо.Это смотря какая архитектура.

К примеру рассылку писем можно через очередь организовать. Клиентское приложение ставит сообщение в очередь, а сервис (что крутится не на XP) выгребает эту очередь в несколько потоков и выполняет Send.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852042
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Нельзя на Net 4.5 закладываться пока XP еще живо.

Зато 4.0 на XP работает. И на 4.0 можно заюзать async/await через BCL. Проходили уже

А 2.0 уже давным давно пора похоронить и не вспоминать всуе.


Дмитрий77>BackgroundWorker,разбираться с многопоточностью
Я счас не ставлю вопрос об этом

Ты вроде не хотел зависаний во время отправки писем? BackgroundWorker — то, что Малахов прописал.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852047
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAК примеру рассылку писем можно через очередь организовать. Клиентское приложение ставит сообщение в очередь, а сервис (что крутится не на XP) выгребает эту очередь в несколько потоков и выполняет Send.

куда ж тя понесло? человек пока азы .НЕТ-а старается осилить, да ещё и на VB — это сильно!
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852053
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAК примеру рассылку писем можно через очередь организовать. Клиентское приложение ставит сообщение в очередь, а сервис (что крутится не на XP) выгребает эту очередь в несколько потоков и выполняет Send.

куда ж тя понесло? человек пока азы .НЕТ-а старается осилить, да ещё и на VB — это сильно!А тебе-то что?
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852054
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77CDO.Message.Send() кстати не вешает форму
а System.Net.Mail.SmtpClient.Send() (без Async) -вешает

всё логично.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852057
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА тебе-то что?

пытаюсь понять, зачем ты занимаешься садизмом
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852059
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAА тебе-то что?

пытаюсь понять, зачем ты занимаешься садизмомА, ну валяй. Только я тебе тут не помогу, потому как я не считаю, что занимаюсь садизмом. Так что ты как-нибудь сам разберись в своих выводах.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852065
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА, ну валяй. Только я тебе тут не помогу, потому как я не считаю, что занимаюсь садизмом. Так что ты как-нибудь сам разберись в своих выводах.

едкая муха укусила? хотя чего я спрашиваю, ты ж в своём репертуаре
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852069
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAА, ну валяй. Только я тебе тут не помогу, потому как я не считаю, что занимаюсь садизмом. Так что ты как-нибудь сам разберись в своих выводах.

едкая муха укусила? хотя чего я спрашиваю, ты ж в своём репертуаре Нет, просто смайлики не ставлю, чтобы набросить тебе мыслей для анализа.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852087
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНет, просто смайлики не ставлю, чтобы набросить тебе мыслей для анализа.

ну я ж говорю, ты в своём репертуаре. лишь бы чего-нибудь набросить, каких-нибудь анализов )
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852091
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAНет, просто смайлики не ставлю, чтобы набросить тебе мыслей для анализа.

ну я ж говорю, ты в своём репертуаре. лишь бы чего-нибудь набросить, каких-нибудь анализов )А чего бы не набросить, коли тебе так и хочется их.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852104
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий77CDO.Message.Send() кстати не вешает форму
а System.Net.Mail.SmtpClient.Send() (без Async) -вешает
всё логично.
Логично то оно логично.
Только CDO.Message.Send() , не вешая форму ждет результата (предполагаю что он внутри себя содержит DoEvents())

System.Net.Mail.SmtpClient.Send() ( без Async ) -тоже ждет результата (но при этом очевидно НЕ содержит никаких DoEvents())
А после System.Net.Mail.SmtpClient.Send Async () -который форму НЕ завешивает и поэтому предпочтительней результат надо отлавливать через CallBack.

Улавливаешь разницы?

Ладно, счас сделаю простой проект и буду думать как в ф-цию CallBack скормить. Потому как вопрос интересный.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852132
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Вот интересное чтиво на эту тему, очень рекомендую ознакомиться

http://stackoverflow.com/questions/5181777/use-of-application-doevents
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852133
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Application.DoEvents() - The call of the devil.
...
Рейтинг: 0 / 0
Как передать кастом-CallBack ф-цию в качестве аргумента в другую ф-цию?
    #38852138
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий77,

Application.DoEvents() - The call of the devil.

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


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