从同步功能调用异步功能

时间:2019-11-04 15:49:35

标签: c# async-await

我在ac#控制台应用程序中有一个函数,该函数调用async函数(我的目标是通过控制台应用程序调用azure函数。此函数负责将zip文件转换为csv文件,当然我想并行处理zip文件)

在这里您可以找到我的代码的一部分:

Parallel.ForEach(blobs, (currentblob) =>
                    {

                        string FileUrl = currentblob.Uri.ToString();
                        string FileName = currentblob.Uri.Segments.Last();
                        //string content = "{ \"fileUri\": \""+ currentblob.Uri.ToString()+ "\" , \"fileName\": \""+ currentblob.Uri.Segments.Last()+"\"}";
                        Console.WriteLine(currentblob.Uri + " #### " + currentblob.Uri.Segments.Last());
                        var values = new Dictionary<string, string>
                        {
                            { "fileUri", currentblob.Uri.ToString() },
                            { "fileName", currentblob.Uri.Segments.Last() }
                        };
                        var content = new FormUrlEncodedContent(values);
                        string baseURL = @"https://<afu>.azurewebsites.net/api/process_zip_files_by_http_trigger?code=45"; ;
                        //string urlToInvoke = string.Format("{0}&name={1}", baseURL, FileUrl, FileName);


                         Run(baseURL, content);


                    }); 

我有一个异步函数:

public static async void Run(string i_URL,FormUrlEncodedContent content)
        {
            HttpClient client = new HttpClient();
            HttpResponseMessage response = await client.PostAsync(i_URL,content);
            string responseString = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseString);
            Console.ReadLine();
        }

我可以运行我的代码而没有任何错误,但是它不处理zip文件。但是在我停止调试之后,我开始处理文件!!!

我认为我的异步功能出了点问题。您知道为什么我的代码无法正常工作吗?我可以正确调用异步函数吗?

1 个答案:

答案 0 :(得分:2)

首先,您调用异步void方法,这些方法不提供信号完成的方式,仅用于事件处理程序。其次,要并行处理异步方法,请使用带有Task.WhenAll而不是Select的{​​{1}}。 Parallel.ForEach仅适用于CPU绑定的操作,不适用于异步任务。最后,然后应该一直使用async直到应用程序的根目录并等待所有结果,这将使您的进程保持活动状态,直到处理完所有blob。

Parallel.ForEach