我可能错了,但是如果您在 ASP.NET 2.0 中使用 SmtpClient.SendAsync 并且它引发异常,则处理请求的线程会无限期地等待操作完成。
要重现此问题,只需为发送电子邮件时无法解析的主机使用无效的 SMTP 地址。
请注意,您应该设置 Page.Async = true 以使用 SendAsync。
如果 Page.Async 设置为 false 并且 Send 抛出异常,线程不会阻塞,并且页面被正确处理。
TIA。
我可能错了,但是如果您在 ASP.NET 2.0 中使用 SmtpClient.SendAsync 并且它引发异常,则处理请求的线程会无限期地等待操作完成。
要重现此问题,只需为发送电子邮件时无法解析的主机使用无效的 SMTP 地址。
请注意,您应该设置 Page.Async = true 以使用 SendAsync。
如果 Page.Async 设置为 false 并且 Send 抛出异常,线程不会阻塞,并且页面被正确处理。
TIA。
请注意,您应该设置 Page.Async = true 以使用 SendAsync。
请解释这背后的理由。误解 Page.Async 的作用可能是导致您出现问题的原因。
抱歉,我无法找到重现问题的示例。
请参阅http://msdn.microsoft.com/en-us/magazine/cc163725.aspx(邪恶代码:ASP.NET 2.0 中的异步页面)
编辑:查看您的代码示例,我可以看到您没有使用RegisterAsyncTask()
该类PageAsyncTask
。@Async
我认为在设置为 true的页面上执行异步任务时必须这样做。MSDN Magazine 中的示例如下所示:
protected void Page_Load(object sender, EventArgs e)
{
PageAsyncTask task = new PageAsyncTask(
new BeginEventHandler(BeginAsyncOperation),
new EndEventHandler(EndAsyncOperation),
new EndEventHandler(TimeoutAsyncOperation),
null
);
RegisterAsyncTask(task);
}
那么,在里面BeginAsyncOperation
,您是否应该异步发送邮件。
无法使用 RegisterAsyncTask。查看 BeginEventHandler 委托:
公共委托 IAsyncResult BeginEventHandler(对象发送者,EventArgs e,AsyncCallback cb,对象 extraData)
它应该返回一个 IAsyncResult。现在看一下 SmtpClient.SendAsync 函数:
public void SendAsync( MailMessage 消息,对象 userToken )
没有返回值。
无论如何,只要 SmtpClient.SendAsync 不引发异常,这一切正常。
这是我的。试试看。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Using an incorrect SMTP server
SmtpClient client = new SmtpClient(@"smtp.nowhere.private");
// Specify the e-mail sender.
// Create a mailing address that includes a UTF8 character
// in the display name.
MailAddress from = new MailAddress("someone@somewhere.com",
"SOMEONE" + (char)0xD8 + " SOMEWHERE",
System.Text.Encoding.UTF8);
// Set destinations for the e-mail message.
MailAddress to = new MailAddress("someone@somewhere.com");
// Specify the message content.
MailMessage message = new MailMessage(from, to);
message.Body = "This is a test e-mail message sent by an application. ";
// Include some non-ASCII characters in body and subject.
string someArrows = new string(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' });
message.Body += Environment.NewLine + someArrows;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Subject = "test message 1" + someArrows;
message.SubjectEncoding = System.Text.Encoding.UTF8;
// Set the method that is called back when the send operation ends.
client.SendCompleted += new
SendCompletedEventHandler(SendCompletedCallback);
// The userState can be any object that allows your callback
// method to identify this send operation.
// For this example, the userToken is a string constant.
string userState = "test message1";
try
{
client.SendAsync(message, userState);
}
catch (System.Net.Mail.SmtpException ex)
{
Response.Write(string.Format("Send Error [{0}].", ex.InnerException.Message));
}
finally
{
}
}
private void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
// Get the unique identifier for this asynchronous operation.
String token = (string)e.UserState;
if (e.Cancelled)
{
Response.Write(string.Format("[{0}] Send canceled.", token));
}
if (e.Error != null)
{
Response.Write(string.Format("[{0}] {1}", token, e.Error.ToString()));
}
else
{
Response.Write("Message sent.");
}
}
}