如何在C#中使用async和await?

时间:2016-07-21 05:29:26

标签: c# web-services async-await httpclient

我在这里检查属性是否已迁移或正在进行中,如果正在进行中,那么我不想等待来自提供的Response的Web URL消息所以{{ 1}}方法应该在Background中运行 并且HttpPost应该同时执行其任务。 为了实现此功能,我在以下方法中使用了calling methodasync

以下是从网址发布并获取await回复的方法:

XML

上面的方法运行没有错误,但我想知道这是否是在C#中使用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; } async的正确方法, 我是否需要在任何地方修改我的代码,或者根据上述要求是否正确?

await部分中的

await无效。根据文档,这应该运行else-if,即在后台,但目前不是。

任何人都可以检查并提出代码中的错误吗?

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

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

1 个答案:

答案 0 :(得分:-1)

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

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

e.g。

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方法的另一个重要的事情是所有方法(从前端向下)需要标记为async,以允许正确等待。

听起来你正试图将这些作为“火灾和遗忘”类型的方法来运行,但这些只是当你正在做的事情没有返回你随后需要采取行动的信息以及你确定任何可能发生的例外都不会损害您的申请。遇到的任何异常都不会反映到您的应用程序。

真火和忘记用例很少见。

有关为什么在异步编程时必须“完全失败”的更多信息:

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

有关火灾和遗忘的更多信息(请务必阅读上一篇文章中关于“避免异步空白”的部分:

Fire and Forget approach