在.net3.5中SendAsync()发生了什么?

本文关键字:发生了 什么 SendAsync net3 | 更新日期: 2023-09-27 18:18:40

所以在我的程序中,我正在使用。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函数,该函数将日志中发送的电子邮件作为对象记录下来,但这不是对象。当我给它任何其他东西时,比如字符串或整数变量,我发送电子邮件没有问题。

我想看看这个对象的用法,以便更好地掌握发生了什么。

在.net3.5中SendAsync()发生了什么?

在我参与的另一个项目中,我使用WebRequest异步发送HTTP请求。BeginGetResponse请求一个AsyncCallback函数,我用来处理GetResponse的结果。

这是WebRequest,它使用"异步编程模型(APM)"(使用XxxBegin(并传入回调或调用XxxEnd(方法)。SmtpClient使用"基于事件的异步模式(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);

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

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

你根本不需要使用这个参数。你可以通过null。如果没有更多的背景,我不知道该推荐什么