У меня есть метод отправки электронной почты с помощью SMTP-сервера. Используя Task.Factory
, я вызываю этот метод, чтобы не блокировать пользовательский интерфейс:
Task.Factory.StartNew(() => SendMail("[email protected]", "Test title", "TEST body"), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default)
.ContinueWith(p =>
{
if (p.IsFaulted)
{
if (p.Exception != null)
{
MessageBox.Show(p.Exception.ToString());
}
return;
}
MessageBox.Show("ok");
}, TaskScheduler.FromCurrentSynchronizationContext());
Теперь я хотел бы изменить свой код, чтобы иметь возможность попытаться вызвать SendMail
10 раз, если что-то пойдет не так. Я пробовал использовать блок do / while, но не могу заставить его работать:
private void button1_Click(object sender, EventArgs e)
{
bool success = false;
int i = 0;
int max = 10;
do
{
Task.Factory.StartNew(() => SendMail("[email protected]", "Test", "TEST1"), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default)
.ContinueWith(p =>
{
if (p.IsFaulted)
{
if (p.Exception != null)
{
MessageBox.Show(p.Exception.ToString());
}
return;
}
success = true;
MessageBox.Show("ok");
}, TaskScheduler.FromCurrentSynchronizationContext());
i++;
} while (!success && i < max);
if (!success)
{
MessageBox.Show("error");
}
else
{
MessageBox.Show("ok", "success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void SendMail(string address, string title, string body)
{
Thread.Sleep(10000);
MailClient.Instance.Send(address, title, body);
}
Что я хотел бы сделать, так это иметь возможность вызывать конкретный метод внутри задачи, если я получаю исключение, я хотел бы вызывать его снова и снова, 10 раз, если после этих 10 раз он не будет успешным, я хочу показать исключение.
send
, кроме того, после вызова моего кода я получаю сообщениеerror
. - person Misiu   schedule 18.07.2014SendMail
? - person mazharenko   schedule 18.07.2014TryAndRepeat
? - person Misiu   schedule 18.07.2014