【发布时间】:2016-07-21 05:29:26
【问题描述】:
在这里,我正在检查属性是否已迁移或正在进行中,如果正在进行中,那么我不想等待来自提供的 URL 的 Web Response 消息,因此 HttpPost 方法应该在后台运行
和calling method 应该同时执行它的任务。
为了实现这个功能,我在下面的方法中使用了async 和await。
以下是从 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# 中使用 async 和 await 的正确方法,
我需要在任何地方修改我的代码还是按照上述要求正确?
else-if 中的await 部分不起作用。根据文档,这应该运行asynchronously,即在后台运行,但目前不是。
任何人都可以检查并提出代码中的问题吗?
他们有更好的方法来实现这一点吗?
感谢任何建议和想法!感谢您的帮助!
【问题讨论】:
-
如果您从服务器获取块中的 xml,除非修改服务器代码,否则您实际上无法将数据作为连续数据获取。在块中获取数据可能比获取可能导致内存异常的一大块数据更有效。巨大的 xml 文件通常会导致内存异常,然后您需要使用 xmlreader 以您现在的方式有效地读取块中的 xml。
-
你想在这里做什么 - 究竟是什么问题?如果问题是在任务返回之前您没有从该方法获得响应,那么这是可以预期的。
-
@Paddy :问题是我使用
await在后台运行client.PostAsync(SupplierLinkUri, httpContent);在其他部分按照文档但它是同步运行的。 -
如何检查它是否同步运行?您可能希望在您的 Common.HttpPost btw 前面包含一个“等待”。
-
@Paddy:我们在那个 url 上有测试应用程序,我们发布像
Task<HttpResponseMessage> httpPostTask = client.PostAsync(SupplierLinkUri, httpContent); HttpResponseMessage waitPost = await httpPostTask; // This is not working why?这样的数据,然后当我们调试两个应用程序时,控件从这一行开始并停留在另一个名为方法的应用程序上。但我希望它返回并在后台运行第二个应用程序,因为我使用了await,但它似乎无法正常工作。
标签: c# web-services async-await httpclient