在C#

时间:2018-08-07 09:49:50

标签: c# multithreading asynchronous task-parallel-library threadpool

我有一个作为调度程序运行的控制台应用程序,并且该应用程序使用了Web API,并且具有如下所述的两个部分

  1. 将文件发布到API-我将一些文件发送到API以获取 文件中的一些信息。
  2. 从API中获取响应-我正在接收响应的地方 从我之前已经发送到API的API中获取。

因此,流程将如下所示。调度程序最初运行时,我将向API发送一些文件(例如A,B和C)。 API会花一些时间来处理文件。

因此,下次运行调度程序时,它将发布更多文件D,E,F等,并尝试获取A,B,C的响应

如下所示的代码框架

 static void Main(string[] args)
        {                               
            //"starting Posting files to API";
            PostDatas(ds);                

            //"Getting Response from the API";
            GetResponseXML(ds);               

        }
        public static void PostDatas(DataSet ds)
        {
            var client = new HttpClient();
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                //post the files 
                var response = client.PostAsync(URL, ReqClass, bsonFormatter).Result;

            }
        }
        public static void GetResponseXML(DataSet ds)
        {
            var clientResponse = new HttpClient();
            foreach (DataRow dr in ds.Tables[1].Rows)
            {
                //get the response.
                var response = clientResponse.PostAsync(URL,ReqClass, bsonFormatter).Result;

            }
        }
    }

这里所有过程都是同步的,这会导致太多时间。

我想以异步方式进行发布过程并获得响应。将多个文件一起发布,并同时获得多个文件的响应

我该如何实现?使用线程概念或使用异步等待概念或TPL(任务并行库)。我应该在上面的代码中执行哪些更改,以使其异步工作。

请帮助提供样品。

1 个答案:

答案 0 :(得分:1)

您需要create an async version of your Main,然后并行调用每个方法,然后var feedURL = "https://feeds.feedburner.com/raymondcamdensblog?format=xml"; $.ajax({ type: 'GET', url: "https://api.rss2json.com/v1/api.json?rss_url=" + feedURL, dataType: 'jsonp', success: function(result) { console.log(result); } }); ,然后返回结果。我想这就是您想要的,因此在此阻止您的await?您可以在此处添加其他线程池线程,但是我怀疑您会从中获得很多好处。我只在下面做了一种方法,因为另一种方法基本相同:

void Main

C#7.0 中,您可以取消使用static void Main(string[] args) { MainAsync(args).GetAwaiter().GetResult(); } static async Task MainAsync(string[] args) { DataSet ds = new DataSet(); /*logic for getting dataset values.table0 contains posting file details and Table1 contains details of files which need response*/ //"starting Posting files to API"; await PostDatas(ds); //"Ending Posting files to API"; //"Getting Response from the API"; await GetResponseXML(ds); //"Ending Getting Response from the API"; } public async static Task PostDatas(DataSet ds) { var client = new HttpClient(); List<Task<HttpResponseMessage>> tasks = new List<Task<HttpResponseMessage>>(); foreach (DataRow dr in ds.Tables[0].Rows) { //post the files tasks.Add(client.PostAsync(URL, ReqClass, bsonFormatter)); } await Task.whenAll(tasks); foreach(var response in tasks) { //you can access Result here because you've awaited //the result of the async call above HttpResponseMessage message = response.Result; //etc. } } 并声明主.GetAwaiter().GetResult();async

请注意,DataSet is not threadsafe 。因此,我不建议您使用此方法更改该类。

如果您不担心在运行Getresponse之前等待帖子,则还可以添加其他Pararisation:

static async Task Main(string[] args)