【问题标题】:C# WebClient parallel call to API with Async/ AwaitC# WebClient 使用 Async/Await 并行调用 API
【发布时间】:2017-08-21 16:32:48
【问题描述】:

我是 Async/Await 的新手。我必须将 api 和 sace 结果调用到 txt 文件中。我使用了 webclient.OpenRead 并且能够保存文件。我想通过对 API 的多个输入来运行我的代码,并且我想并行运行它。

对于顺序操作,我使用 WebClient.OpenRead() 作为代码工作。

class Program
{
    static void Main(string[] args)
    {
        var name = "test1";
        var filename = $"c:\\temp\\{name}.txt";
        var url = $"https://testapi?name eq '{name}')";
        using (var client = new WebClient())
        {
            using (Stream stream = client.OpenRead(url))
            using (StreamReader streamReader = new StreamReader(stream))
            using (JsonTextReader reader = new JsonTextReader(streamReader))
            {
                reader.SupportMultipleContent = true;
                var serializer = new JsonSerializer();
                var parsedData = serializer.Deserialize(reader).ToString();
                File.WriteAllText(filename, parsedData);
                Console.WriteLine($"Result save at {filename}");
            }
        }
    }
}

对于并行操作,我尝试使用 WebClient.OpenReadAsync() 但我的代码没有将文件保存在 c:\temp\

static void Main(string[] args)
        {

            var names = new string[] { "test1", "test2" };
            foreach (var name in names)
            {
                var filename = $"c:\\temp\\{name}.txt";
                 var url = $"https://testapi?name eq '{name}') ";
                var client = new WebClient();
                client.OpenReadCompleted += (sender, e) =>
                {
                    Stream reply = (Stream)e.Result;
                    StreamReader s;
                    s = new StreamReader(reply);
                    using (JsonTextReader reader = new JsonTextReader(s))
                    {
                        reader.SupportMultipleContent = true;
                        var serializer = new JsonSerializer();
                        var parsedData = serializer.Deserialize(reader).ToString();
                        File.WriteAllText(filename, parsedData);
                        Console.WriteLine($"Result save at {filename}");
                    }
                };
                client.OpenReadAsync(new Uri(url));
            }
        }

我的代码有什么问题?任何指针?

【问题讨论】:

    标签: c# async-await webclient


    【解决方案1】:

    以下是与您的任务并行的代码。请注意,我不使用 foreach 循环,在您的情况下这意味着顺序任务执行。重要的部分是,首先我创建一个应该执行的任务列表,然后我通过包装一个任务列表使用Task.WhenAll 创建一个任务,然后我使用 .Wait(); 等待任务结束;

    另外,请阅读.Wait()。以及它的行为方式。它有效地阻塞了应用程序的线程,这在更复杂的应用程序中是不需要的。

    static void Main(string[] args)
    {
        var tasks = new[] {"test1", "test2"}.Select(SaveData);
        Task.WhenAll(tasks).Wait();
    }
    
    private static async Task SaveData(string fileName)
    {
        var filename = $"c:\\temp\\{fileName}.txt";
        var url = $"https://testapi?name eq '{fileName}') ";
        var client = new WebClient();
    
        client.OpenReadCompleted += (sender, e) =>
        {
            var reply = e.Result;
            StreamReader s;
            s = new StreamReader(reply);
            using (var reader = new JsonTextReader(s))
            {
                reader.SupportMultipleContent = true;
                var serializer = new JsonSerializer();
                var parsedData = serializer.Deserialize(reader).ToString();
                File.WriteAllText(filename, parsedData);
                Console.WriteLine($"Result save at {fileName}");
            }
        };
    
        await client.OpenReadTaskAsync(new Uri(url));
    }
    

    【讨论】:

    • 感谢您的回复。有用。有时,我从 e.Result 收到错误为 {“远程服务器返回错误:(500) 内部服务器错误。”}。这可能来自服务。
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多