.NET3.5中的SendAsync()发生了什么

时间:2015-10-21 20:38:34

标签: c# multithreading .net-3.5 smtpclient

所以在我的程序中,我正在构建并使用.NET 3.5中的STMPClient发送电子邮件。由于我无法控制的情况,我必须使用.NET 3.5。我正在选择使用SendAysnc()发送电子邮件。如

SmtpClient client = new SmtpClient(emailsrvr, emailport);
smtpclient.Credentials = //Credentials from server
MailMessage email = new MailMessage();

/*
 Skipping lines
*/
Object x;
smtpClient.SendAsync(email, x);

该方法调用MailMessage和对象。在MSDN文档示例中,它们使用字符串变量。在我的代码中,我尝试使用CallBack函数将日志中发送的电子邮件写为对象,但这不是对象。当我给它任何其他东西,比如字符串或整数变量时,我发送没有问题的电子邮件。

我正试图看到对象的使用,并更好地掌握正在发生的事情。

2 个答案:

答案 0 :(得分:0)

https://msdn.microsoft.com/en-us/library/x5x13z6h(v=vs.110).aspx

  

userToken:传递给异步操作完成时调用的方法的用户定义对象

您根本不必使用该参数。您可以传递null。不确定在没有更多背景的情况下推荐什么。

答案 1 :(得分:0)

  

在我工作的另一个项目中,我使用WebRequest.BeginGetResponse异步发送HTTP请求,该请求提出了我用来处理GetResponse结果的AsyncCallback函数。

那个WebRequest,使用" Asynchronous Programming Model (APM)" (使用XxxBegin(并传入回调或调用XxxEnd(方法)。 SmtpClient使用" Event-based Asynchronous Pattern (EAP)" (运行一个立即返回并等待事件触发的方法)。

SendAsync中的第二个参数是什么,这样你可以告诉哪个方法引发了事件,所有用它完成的事件都被传递给事件处理程序。如果您没有对多个事件处理程序使用相同的方法,则可以直接将null传递给它,而不需要声明变量。

这是一个有用的例子

void Example()
{
    SmtpClient client1 = new SmtpClient(emailsrvr, emailport);
    client1.SendCompleted += OnSendCompleted;
    SmtpClient client2 = new SmtpClient(emailsrvr, emailport);
    client2.SendCompleted += OnSendCompleted;

    MailMessage message1 = //...
    MailMessage message2 = //...
    client1.SendAsync(message1, "1");
    client2.SendAsync(message2, "2");
}

void OnSendCompleted(object sender, AsyncCompletedEventArgs args)
{
    Console.WriteLine("Message {0} sent!", args.UserState);
}

//Prints out:
//Message 1 sent!
//Message 2 sent!

对于您的代码,因为您没有订阅SendCompleted,您只能传递null。

SmtpClient client = new SmtpClient(emailsrvr, emailport);
smtpclient.Credentials = //Credentials from server
MailMessage email = new MailMessage();

/*
 Skipping lines
*/
smtpClient.SendAsync(email, null);