这是真正的异步电子邮件和最佳做法吗?

时间:2016-06-01 16:50:16

标签: c# .net email asynchronous task

我正在努力学习和掌握ASYNC和AWAIT,但目前尚不清楚我的工作是否正确到底。我的意思是代码有效,我拿了两个相同形式的浏览器/实例并单击,好吧,几乎在同一时间,一切都很顺利。我收到了2封电子邮件,但这是正确的方式吗?它真的给了一个加号值来做异步而不是同步......

这是我的代码:

    public static async Task SendEmail(params etc...) 
    {
        await SendMailForTemplateID(params etc...);
    }

    private static Task SendMailForTemplateID(params etc...)
    {


            var task = Task.Factory.StartNew(() =>
            {
                MailMessage message = new MailMessage();
                MailMessage mail = new MailMessage();
                //SmtpClient SmtpServer = new SmtpClient(ConfigurationManager.AppSettings["SMTPHost"]);
                SmtpClient SmtpServer = new SmtpClient("localhost"); // for test purpose only
                mail.From = new MailAddress(from);
                mail.To.Add(to);
                mail.Subject = GetSubjectForTemplateId(templateID, extraMsg, dataInfo, fromName, toName, isFr);
                mail.Body = GetBodyForTemplateId(templateID, extraMsg, dataInfo, fromName, toName, isFr);
                mail.IsBodyHtml = false; 
                SmtpServer.Port = 81; // for test purpose only
                SmtpServer.Credentials = new System.Net.NetworkCredential
                    (ConfigurationManager.AppSettings["CredentialUser"],
                    ConfigurationManager.AppSettings["CredentialPassword"]);

                bool result;
                bool.TryParse(ConfigurationManager.AppSettings["EnableSSL"], out result);
                SmtpServer.EnableSsl = result;

                SmtpServer.Send(mail);

                //* make sure we leave nothing in memory
                message.Dispose();
                mail.Dispose();
                SmtpServer.Dispose();


            });

            return task;

       }

然后邮件代码如下所示,根据从stackoverflow获取的示例代码:

     do stuff...
     await Utility.MailUtility.SendMailForTemplateID(params);
     do stuff...

   public static async Task SendMailForTemplateID(params...)
    {
        try
        {
            email code etc...

            await smtpClient.SendMailAsync(mail);

            mail.Dispose();
            smtpClient.Dispose();


        }
        catch (Exception)
        {
            // Log ex
        }
    }

我很抱歉,但我不知道如何在我的回复之间放回线(回车)。可能吗?关于ASYNC-EMAIL的最佳实践。

我的新版本的代码看起来像这样,它的编码工作更简单,但是它是对的吗?我的意思是没有新的线程,它是否给出了VS值同步sendmail方法等...

我在MVC行动中称呼它。代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import pandas as pd

data = pd.read_table('[data´s location on the disk]')
print data 

nx, ny = 1392, 1039
x = range(nx)
y = range(ny)
hf = plt.figure()
ha = hf.add_subplot(111, projection='3d')
X, Y = np.meshgrid(x, y)  
ha.plot_surface(X,Y,data,rstride=1,cstride=1)

plt.show()

1 个答案:

答案 0 :(得分:4)

不,将异步调用包装到Task.Run是编写async / await代码的错误方法。

当前代码的一个特殊问题是Task.RunTask.Factory.StartNew启动新线程来执行操作 - 因此代码启动2个额外的线程来执行操作。

正确的方式 - 完全删除所有Task.Run / Task.Factory.StartNew次呼叫和await异步呼叫。在您的情况下,SmtpClient.SendMailAsync应该在最低级别而不是SmtpServer.Send(mail);使用。

在更通用的情况下,当没有基于任务的API但有一些替代异步API(如基于事件的SmtpClient.SendAsync)时,您可能需要提供包装帮助器方法来将此类调用转换为基于任务的{ {1}}方法。 Convert Event based pattern to async CTP pattern

中显示了一些方法

近似代码:

async