Web 服务 - 如何在 C# 中使用异步和等待

本文关键字:异步 等待 服务 Web | 更新日期: 2023-09-27 17:58:10

在这里,我正在检查属性是已迁移还是正在进行,如果正在进行,那么我不想等待来自提供的URL的 Web Response消息HttpPost因此该方法应在后台运行calling method应同时执行其任务。为了实现此功能,我在以下方法中使用了asyncawait

以下是从URL发布和获取XML响应的方法:

public static async Task<string> HttpPost(string url, string message, bool ignoreResponse = false)
{
    string lcPostData = null;
    string _XmlResponse = string.Empty;
    try
    {            
        using (var client = new HttpClient())
        {
            var httpContent = new StringContent(message, Encoding.UTF8, "application/xml");
            var SupplierLinkUri = new Uri(url);
            if (!ignoreResponse)
            {                    
                var httpResponseMessage = await client.PostAsync(SupplierLinkUri, httpContent);
                if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
                    _XmlResponse =  httpResponseMessage.Content.ReadAsStringAsync().Result;
            }
            else if (ignoreResponse && !(isReservation(message)))   //message.Contains("Reservation"))
            {       
                /* I want below lines of code to run asynchronously (i.e. Run in background) So I used Task & await but it fails*/
                Task<HttpResponseMessage> httpPostTask = client.PostAsync(SupplierLinkUri, httpContent);
                HttpResponseMessage asyncPost = await httpPostTask;                 
            }
        }       
    }
    catch (Exception e)
    {       
    }
    return _XmlResponse;
}

上面的方法运行没有错误,但我想知道这是否是在 C# 中使用 asyncawait 的正确方法,我是否需要在任何地方修改我的代码,或者根据上述要求它是正确的?

else-if部分await不起作用。根据文档,这应该asynchronously运行,即在后台运行,但目前不是。

任何人都可以检查并建议代码中有什么问题吗?

他们有更好的方法来实现这一目标吗?

感谢任何建议和想法!感谢您的帮助!

Web 服务 - 如何在 C# 中使用异步和等待

好的 -

这不是 async/await 的目的 - 当你等待时,你调用的方法在另一个线程(不是 UI 线程(上运行,并在完成后将控制权返回给你的主方法(通过后台的延续(。

在异步调用完成之前,"await"的方法不会返回其结果。

例如

async Task<int> A()
{
    return await B();
}
async Task<int> B()
{
     //Call to a long running service to get your answer, e.g.
    return  await PostToClientAsynchronously();
}
//Event handler on front end.
async void SomeButton_Click() {
    txtBox1.Text = await A();
}

在上面的示例中,PostToClientAsynchronously将在另一个线程(不是 UI 线程(上运行,但在发布完成之前,控件不会返回以在事件处理程序中设置文本框值。

我想为你自己的代码发布一个示例,但说实话,我不确定你想做什么。 我怀疑可以通过将异步方法扩展到您的 UI 来解决该问题,从而不阻止它并允许其他操作,但我不确定。

调用 async/await 方法的另一个重要之处在于,所有方法(从前端向下(都需要标记为异步,以允许正确的等待。


听起来您正在尝试将这些方法作为"即发即弃"类型方法运行,但只有当您正在执行的操作不返回随后需要操作的信息并且您确定可能发生的任何异常都不会损害您的应用程序时,这些方法才真正有用。 遇到的任何异常都不会冒泡回您的应用程序。

真正的即发即忘用例很少见。


有关为什么异步编程时必须"一路向下"的更多信息:

https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

有关 fire and forget 的更多信息(请务必阅读上一篇文章中关于"避免异步无效"的部分:

即发即弃方法