我在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文件。但是在我停止调试之后,我开始处理文件!!!
我认为我的异步功能出了点问题。您知道为什么我的代码无法正常工作吗?我可以正确调用异步函数吗?
答案 0 :(得分:2)
首先,您调用异步void方法,这些方法不提供信号完成的方式,仅用于事件处理程序。其次,要并行处理异步方法,请使用带有Task.WhenAll
而不是Select
的{{1}}。 Parallel.ForEach
仅适用于CPU绑定的操作,不适用于异步任务。最后,然后应该一直使用async直到应用程序的根目录并等待所有结果,这将使您的进程保持活动状态,直到处理完所有blob。
Parallel.ForEach