在 C# 中使用 Web 服务:删除 Task.Wait()
Posted
技术标签:
【中文标题】在 C# 中使用 Web 服务:删除 Task.Wait()【英文标题】:Consume a Web Service in C#: Remove Task.Wait() 【发布时间】:2020-07-13 07:43:08 【问题描述】:我正在尝试使用 Web 服务。这是一个基于 XML 的服务。我的意思是 XML 格式的响应。代码工作正常。但是,我不想使用 task.Wait()。请告诉我如何用 async/await 替换它。
下面是我的代码:
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace ConsoleApp6
class Program
static void Main(string[] args)
Program obj = new Program();
var result = obj.GetData().Result;
public async Task<string> GetData()
string url =
"https://test.net/info.php?akey=abcd&skey=xyz";
HttpClient client = new HttpClient();
HttpResponseMessage response = client.GetAsync(url).Result;
var responseValue = string.Empty;
if (response != null)
Task task = response.Content.ReadAsStreamAsync().ContinueWith(t =>
var stream = t.Result;
using (var reader = new StreamReader(stream))
responseValue = reader.ReadToEnd();
);
task.Wait(); // How I can replace it and use await
return responseValue;
[XmlRoot(ElementName = "Info")]
public class Test
[XmlAttribute(AttributeName = "att")]
public string SomeAttribute get; set;
[XmlText]
public string SomeText get; set;
【问题讨论】:
啊——你就这么做了? Task.await() -> 等待 response.Content.ReadStreamAsync().... 请注意.Result
。
你在一个异步上下文中,你有一个任务,只需await
它就像这样await task;
【参考方案1】:
您已经在async
上下文中,所以只需使用await
:
var stream = await response.Content.ReadAsStreamAsync();
using (var reader = new StreamReader(stream))
responseValue = reader.ReadToEnd();
也就是说,你应该检查你所有的电话:
HttpResponseMessage response = await client.GetAsync(url);
并使您的 main
也异步,当我们这样做时,将方法设为静态:
public static async Task Main)
var result = await GetData();
您的方法签名在哪里:
public static async Task<string> GetData()
static
不是必需的,但如果副作用越少,您会发现并行和/或异步编程要容易得多。
【讨论】:
早期的.Result
如果不加以解决,可能会导致问题。
@Olivier true,没有看到所有实例 :)
感谢您的快速解决方案。如果有任何关于异步/等待的好文章。请回复
@KiddoDeveloper 查看Stephen Cleary's blog!
我不知道有什么“好”的,但如果我将“async await c#”放入谷歌,第一个链接就是 Microsoft 文档,它看起来像是一个非常可靠的开始。【参考方案2】:
您也可以制作Main
method async
和await
GetData
static async Task Main(string[] args)
Program obj = new Program();
var result = await obj.GetData();
【讨论】:
感谢您的建议。我认为它是 C# 7.0 的一个特性,并且正在使用旧版本以上是关于在 C# 中使用 Web 服务:删除 Task.Wait()的主要内容,如果未能解决你的问题,请参考以下文章
在 C# .NET Web 应用程序中每天安排任务的正确方法
在 C# 中使用 SSL (https) 使用 Web 服务