【发布时间】:2015-06-03 03:51:15
【问题描述】:
我有一个加载一些插件(dll)并调用它们的 Process 方法的网络服务。其中一个插件获取成员列表并确保它们都包含在 MailChimp 列表中。
这是将用户添加到 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。作为 async/await 的新手,我不确定对我的其余代码的影响......特别是因为它与我尝试重用 httpClient 而不是为每个 http 调用实例化一个新的尝试有关。
我不确定当它像我一样被包裹在一个 foreach 中时会发生什么。在异步运行时我会遇到重用 httpClient 重复调用的问题吗?
我的另一个问题是,实际上将返回什么。 IOW,我的理解是等待返回一个任务。但是,在这里,我正在遍历列表并多次调用 await PostAsync。我的方法返回一个任务。但是哪个任务会被返回?如果我的调用方法需要等待完成才能继续,它的调用是什么样的?
private void Process()
{
//Get List
var task = AddMCUsers(list);
task.Wait();
//Subsequent processing
}
我了解到您应该一直使用 Async。这是否意味着我的调用方法应该看起来更像这样?
public async Task Process()
{
//Get list
...
await AddMCUsers(list);
//Other processing
}
感谢您为此提供的任何帮助。
【问题讨论】:
-
只是一个快速的建议——请永远不要使用
catch { ... }或catch (Exception ex) { ... }。这只是一个非常糟糕的习惯,它会吞噬错误,使您的代码难以调试。
标签: c# asynchronous async-await