在 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 asyncawait 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 服务

要在 C# 中使用 RESTful Web 服务,我应该使用 HttpWebRequest 吗?

在 c# 中接收 web 服务中的请求?

如何在 C# 中将 Web 服务商店调用到列表中 [关闭]

从 C# 发送 html 电子邮件