我有一个作为调度程序运行的控制台应用程序,并且该应用程序使用了Web 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(任务并行库)。我应该在上面的代码中执行哪些更改,以使其异步工作。
请帮助提供样品。
答案 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)