这个使用TaskCompletionSource的异步方法有意义吗?

时间:2017-02-04 12:14:30

标签: c# asp.net .net asynchronous async-await

我试图理解一段我自己没有写过的代码。这是发送电子邮件的异步方法,最多可以尝试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行。

1 个答案:

答案 0 :(得分:3)

这样做是因为您希望您的API可能是异步的,而实现则决定它是实际异步还是同步。

就此而言,您可以使用TaskCompletionSource<TResult>Task.FromResult<TResult>(TResult result)Task.FromCanceledTask.FromException

为什么建议采用这种方法?

通常您遵循这种方法/原则,因为您可以通过交换实现轻松地使相同的API异步工作,同时将已经同步的API转换为异步需要进行密集和长时间的重构这种变化是可能的。

在一天结束时,由于 awaitables .html - async <的奇迹,您不应该发现以这种方式实施API的巨大差异/ p>