我试图理解一段我自己没有写过的代码。这是发送电子邮件的异步方法,最多可以尝试5次发送给定的邮件消息。
public Task<bool> SendMail(MailMessage mailMessage)
{
bool success = false;
int i = 0;
int smtpRetryCount = 5;
SmtpClient smtpClient = new SmtpClient("myprovider.de");
smtpClient.Port = 123;
smtpClient.EnableSsl = true;
int smtpRetryWaitTime = 2000;
while (i < smtpRetryCount + 1)
{
try
{
smtpClient.Send(mailMessage);
success = true;
Console.WriteLine("SUCCESS");
break;
}
catch (Exception exc)
{
Console.WriteLine("Exception");
Thread.Sleep(smtpRetryWaitTime);
success = false;
}
i++;
}
// This is the part that I don't get, does it make any sense?
TaskCompletionSource<bool> tsc = new TaskCompletionSource<bool>();
tsc.SetResult(success);
return tsc.Task;
}
我想知道这是否真的是异步,如果是这样,它实现了异步属性。对我来说这没有多大意义,特别是最后4行。
答案 0 :(得分:3)
这样做是因为您希望您的API可能是异步的,而实现则决定它是实际异步还是同步。
就此而言,您可以使用TaskCompletionSource<TResult>
,Task.FromResult<TResult>(TResult result)
,Task.FromCanceled
或Task.FromException
。
通常您遵循这种方法/原则,因为您可以通过交换实现轻松地使相同的API异步工作,同时将已经同步的API转换为异步需要进行密集和长时间的重构这种变化是可能的。
在一天结束时,由于 awaitables 和.html
- async
<的奇迹,您不应该发现以这种方式实施API的巨大差异/ p>