Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将布尔方法转换为异步方法_C#_Asynchronous - Fatal编程技术网

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(此电子邮件);
} 
//…代码未更改
}
至于调用此函数的其他方法,它们也应该返回type
Task
,除非它们是事件驱动的,如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(此电子邮件);
} 
//…代码未更改
}
至于调用此函数的其他方法,它们也应该返回type
Task
,除非它们是事件驱动的,如windows窗体或wpf click事件


另请参见如果使用
async
方法,则必须返回
Task

您的方法的正确定义是:

public async Task<Boolean> Send()
您可以查看更多详细信息


另外,请查看有关
async/wait
编程的详细信息。

如果使用
async
方法,则必须返回
Task

您的方法的正确定义是:

public async Task<Boolean> Send()
您可以查看更多详细信息


另外,请查看有关
async/await
编程的详细信息。

可能的答案可以解决您的问题。也可能有帮助。您的
Send
方法非常长,需要重构为更小的方法。通过查看,您似乎将相同的代码重复了几次。重复的部分需要是他们自己的方法,你可以使用参数来控制每次重写之间的微小差异。这可能解决你的问题。也可能有帮助。您的
Send
方法非常长,需要重构为更小的方法。通过查看,您似乎将相同的代码重复了几次。重复的部分需要是它们自己的方法,您可以使用参数来控制每次重写之间的微小差异。“如果使用异步方法,则必须返回任务。”这是不正确的。请参阅Igor的回答。“如果使用异步方法,则必须返回任务。”这是不正确的。见伊戈尔的答案。