2015-02-24 5 views
0

Я создаю приложение winforms, которое должно отправлять электронные письма. Я хочу, чтобы иметь возможность вызвать метод SmtpClient.SendAsync и после этого разрешить пользователю немедленно закрыть приложение (мне не интересно получать результаты отправки в функцию обратного вызова). Если пользователь останавливает приложение, письма не отправляются .... Если приложение остается в рабочем состоянии, письма отправляются как ожидалось ... Любые предложения, как я могу передать все соответствующие данные на сервер smtp и закрыть мое приложение?SmtpClient.SendAsync - остановить приложение после вызова

Благодаря

необходим
+2

Это не так, как это работает, это не так, как это работает ... Асинк не означает, что «Я не заинтересован в результатах» _ и _ «продолжайте делать это, даже если я завершаю свое приложение» _ и отправка электронной почты состоит из разговора с SMTP-сервером и сохранения соединения до тех пор, пока не будет отправлено все сообщение - для каждого сообщения. Это требует времени, и тем более больше сообщений, которые вы хотите отправить. Если вы хотите и можете вставлять сообщения в очередь, вы можете захотеть разгрузить фактическую отправку в службу Windows. – CodeCaster

+2

или (в дополнение к тому, что сказал CodeCaster) запускает выполнение отдельного процесса. –

+0

Я правильно понял, вы предлагаете заменить логику отправки на Службу Windows и вызвать ее из моего winforms-приложения? –

ответ

2

Ваша операция будет разрешено выполнять до доставки на сервер SMTP не будет завершена. Если вам действительно не нравятся результаты, вы можете создать поток переднего плана для выполнения доставки. Таким образом, если пользователь закрывает приложение, его графический интерфейс будет выгружен, но поток переднего плана будет сохраняться до завершения операции. Как только все передние потоки, принадлежащие процессу, прекратятся, сам процесс также завершится.

var t = new Thread(new ThreadStart(() => smtpClient.Send(message))); 
t.IsBackground = false; 
t.Start(); 

Редактировать: Как CodeCaster отметил, этот подход предполагает, что процесс вашего приложения будет продолжать работать после того, как пользователь закрывает окна. Операция завершится неудачно, если пользователь отключит систему (или вручную убивает процесс) до завершения потока.

+0

И затем пользователь выключает свой компьютер, или OP получает жалобы, что их приложение продолжает работать после его закрытия. Не сказать, что это не решение, просто указывая на некоторые недостатки. – CodeCaster

+0

@CodeCaster: действительные баллы. Я предположил, что это была попытка «с максимальным усилием», так как пользователь не заботится о результатах. – Douglas

+0

Большое спасибо! Ваш ответ соответствует 100% моим потребностям. –