我有一个Web服务,加载一些插件(DLL),并调用他们的过程方法。其中一个插件获取成员列表,并确保它们都包含在MailChimp列表中。与HTTPClient foreach异步/等待
这里是,增加了用户的MailChimp组的代码。
private async Task AddMCUsers(List<Member> _memberList)
{
using (var http = new HttpClient())
{
var creds = Convert.ToBase64String(Encoding.ASCII.GetBytes("user:password");
http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", creds);
string memberURI = string.Format(@"{0}lists/{1}/members", _baseURI, _memberGroupId);
var jss = new JavaScriptSerializer();
foreach (var user in _memberlist)
{
var _addStatus = "";
try
{
var content = jss.Serialize(new MCPost()
{
email_address = user.Email,
status = "subscribed",
merge_fields = new MCMergeFields()
{
FNAME = user.Firstname,
LNAME = user.Lastname
}
});
using(var result = await http.PostAsync(memberURI, new StringContent(content,Encoding.UTF8, "application/json")))
{
var resultText = await result.Content.ReadAsStringAsync();
if(result.IsSuccessStatusCode)
{
_addStatus = "Success";
var _returnedUser = jss.Deserialize<MCMember>(resultText);
//Store new user's id
user.ServiceId = _returnedUser.id;
}
else
{
_addStatus = "Fail";
}
}
}
catch {
_addStatus = "Error";
}
LogEvent("Add User - " + _addStatus, string.Format("Id: {0} - {1} {2} (Account: {3}) : {4}", user.Id, user.Firstname, user.Lastname, user.AccountId, user.Email));
}
}
}
在正常的程序代码中,这不成问题。但是,httpClient上唯一可用的Post方法是PostAsync。对于异步/等待的东西相当陌生,我不确定其余代码的分歧......特别是因为它涉及到我重复使用httpClient而不是为每个http调用实例化一个新代码。
我不知道用的await会发生什么时,其在foreach裹得像我有。在异步运行时,我会遇到重复使用httpClient重复调用的问题吗?
我的另一个问题是,什么是真正要被退回。 IOW,我的理解是等待回报一个任务。但是,在这里,我正在循环访问列表并进行多个调用以等待PostAsync。我的方法返回一个任务。但是,返回哪个任务?如果我的调用方法在继续之前需要等待完成,它的调用是什么样子的?
private void Process()
{
//Get List
var task = AddMCUsers(list);
task.Wait();
//Subsequent processing
}
我读过你应该一直使用异步。这是否意味着我的调用方法应该看起来更像这样?
public async Task Process()
{
//Get list
...
await AddMCUsers(list);
//Other processing
}
感谢您提供的任何帮助。
只是一个快速建议 - 请不要做'catch {...}'或'catch(Exception ex){...}'。这只是一个非常不好的习惯,它会吞噬错误,使得代码难以调试。 – Enigmativity