C# 将布尔方法转换为异步方法
我有这样的方法来执行电子邮件发件人:C# 将布尔方法转换为异步方法,c#,asynchronous,C#,Asynchronous,我有这样的方法来执行电子邮件发件人: public void SendIt() { if (_Error && !_Override) return; var html = new StringBuilder(); html.Append(HTMLHeader()); html.Append(Body); html.Append(HTMLClose()); IsHTML = true; SendAsync = true
public void SendIt()
{
if (_Error && !_Override) return;
var html = new StringBuilder();
html.Append(HTMLHeader());
html.Append(Body);
html.Append(HTMLClose());
IsHTML = true;
SendAsync = true;
Body = html.ToString();
Send();
}
我想将此方法更改为异步方法,因此:
public async void SendIt()
{
await Send();
}
但我明白了
“bool”不包含“GetAwaiter”的定义,也不包含
扩展方法“GetAwaiter”接受类型为的第一个参数
可以找到“bool”(您是否缺少using指令或
装配参考?)
发送方法:
public bool Send()
{
var MailFrom = new MailAddress(_From, _From);
_Email.From = MailFrom;
if (_To.IndexOf(';') > -1)
{
string[] tolist = _To.Split(';');
foreach (string toAddress in tolist)
_Email.To.Add(new MailAddress(toAddress.Trim()));
}
else _Email.To.Add(new MailAddress(_To.Trim()));
if (_CC != null && _CC.Length > 5)
{
if (_CC.IndexOf(';') > -1)
{
string[] Cclist = _CC.Split(';');
foreach (string ccAddress in Cclist)
_Email.CC.Add(new MailAddress(ccAddress.Trim()));
}
else _Email.CC.Add(new MailAddress(_CC.Trim()));
}
if (_BCC != null && _BCC.Length > 5)
{
if (_BCC.IndexOf(';') > -1)
{
string[] Bcclist = _BCC.Split(';');
foreach (string bccAddress in Bcclist)
_Email.Bcc.Add(new MailAddress(bccAddress.Trim()));
}
else _Email.Bcc.Add(new MailAddress(_BCC.Trim()));
}
_Email.Subject = _Subject;
_Email.IsBodyHtml = _isHTML;
_Email.Body = _Body;
_Email.BodyEncoding = Encoding.UTF8;
// Smtp Client
var Connection = new SmtpClient(_Server, _Port)
{
DeliveryMethod = SmtpDeliveryMethod.Network,
Timeout = 60000
};
if (_UserName.Length > 1 && _Password.Length > 1 && _Domain.Length > 1)
Connection.Credentials = new NetworkCredential(_UserName, _Password, _Domain);
else if (_UserName.Length > 1 && _Password.Length > 1)
Connection.Credentials = new NetworkCredential(_UserName, _Password);
bool bFlag = true;
Connection.EnableSsl = _SSL;
try
{
Connection.Send(_Email);
}
catch (SmtpFailedRecipientsException ex)
{
var msg = new StringBuilder();
for (int k = 0; k < ex.InnerExceptions.Length; k++)
{
var StatusCode = ex.InnerExceptions[k].StatusCode;
if (StatusCode == SmtpStatusCode.MailboxUnavailable || StatusCode == SmtpStatusCode.MailboxBusy)
{
ErrMsg = "Failed to deliver message to " + ex.FailedRecipient[k].ToString();
try
{
if (_TryAgainOnFailure)
{
System.Threading.Thread.Sleep(_TryAgainDelayTime);
// Send the message
string sTemp = "";
if (_SendAsync)
Connection.SendAsync(_Email, sTemp);
else Connection.Send(_Email);
}
_ErrMsg = string.Empty;
}
catch (SmtpException sex)
{
_ErrMsg = sex.Message;
_Error = true;
}
}
}
}
catch (SmtpException sex)
{
string dat = sex.Data.ToString();
_ErrMsg = sex.Message;
_Error = true;
}
return bFlag;
}
但我得到:
异步方法的返回类型必须为void、Task或Task
我该怎么解决这个问题?问候
异步方法的返回类型必须是void
、Task
或Task
与错误状态一样,您必须将返回类型更改为Task
。然后必须更改方法本身,使其等待任务
或返回任务
public async Task<Boolean> SendAsync() { // renamed your method with suffix Async
// ... code unchanged
try {
await Connection.SendMailAsync(this._Email);
}
// ... code unchanged
}
public async Task sendaync(){//用后缀async重命名了您的方法
//…代码未更改
试一试{
等待连接。SendMailAsync(此电子邮件);
}
//…代码未更改
}
至于调用此函数的其他方法,它们也应该返回typeTask
,除非它们是事件驱动的,如windows窗体或wpf click事件
另见
异步方法的返回类型必须是void
、Task
或Task
与错误状态一样,您必须将返回类型更改为Task
。然后必须更改方法本身,使其等待任务
或返回任务
public async Task<Boolean> SendAsync() { // renamed your method with suffix Async
// ... code unchanged
try {
await Connection.SendMailAsync(this._Email);
}
// ... code unchanged
}
public async Task sendaync(){//用后缀async重命名了您的方法
//…代码未更改
试一试{
等待连接。SendMailAsync(此电子邮件);
}
//…代码未更改
}
至于调用此函数的其他方法,它们也应该返回typeTask
,除非它们是事件驱动的,如windows窗体或wpf click事件
另请参见如果使用
async
方法,则必须返回Task
您的方法的正确定义是:
public async Task<Boolean> Send()
您可以查看更多详细信息
另外,请查看有关
async/wait
编程的详细信息。如果使用async
方法,则必须返回Task
您的方法的正确定义是:
public async Task<Boolean> Send()
您可以查看更多详细信息
另外,请查看有关
async/await
编程的详细信息。可能的答案可以解决您的问题。也可能有帮助。您的Send
方法非常长,需要重构为更小的方法。通过查看,您似乎将相同的代码重复了几次。重复的部分需要是他们自己的方法,你可以使用参数来控制每次重写之间的微小差异。这可能解决你的问题。也可能有帮助。您的Send
方法非常长,需要重构为更小的方法。通过查看,您似乎将相同的代码重复了几次。重复的部分需要是它们自己的方法,您可以使用参数来控制每次重写之间的微小差异。“如果使用异步方法,则必须返回任务。”这是不正确的。请参阅Igor的回答。“如果使用异步方法,则必须返回任务。”这是不正确的。见伊戈尔的答案。