Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C WebClient对API的异步/等待并行调用_C#_Async Await_Webclient - Fatal编程技术网

C# C WebClient对API的异步/等待并行调用

C# C WebClient对API的异步/等待并行调用,c#,async-await,webclient,C#,Async Await,Webclient,我不熟悉异步/等待。我必须将api和sace结果调用到txt文件中。我使用webclient.OpenRead并能够保存文件。我想用API的多个输入来运行我的代码,我想并行运行它 对于顺序操作,我使用WebClient.OpenRead作为代码 class Program { static void Main(string[] args) { var name = "test1"; var filename = $"c:\\temp\\{name}

我不熟悉异步/等待。我必须将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));
            }
        }

我的代码有什么问题?有什么建议吗

下面是与您的任务并行的代码。注意,我没有使用foreach循环,在您的例子中,这意味着顺序任务的执行。重要的一点是,首先我创建了一个应该执行的任务列表,然后我通过包装一个任务列表创建了一个任务,然后我使用等待任务结束

另外,请阅读关于。以及它的行为。它有效地阻止了应用程序的线程,这在更复杂的应用程序中是不需要的

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内部服务器错误。}。这可能来自服务。