我使用此library作为Mailchimp API v3.0的包装器。该库具有async的所有方法。
但是我必须从我的同步方法中调用这些方法并读取结果。
第一个我不得不说我不能把我的方法变成异步。所以我的方法必须保持同步,他们将从这个库中调用异步方法。
所以我阅读了很多关于死锁的文档并避免了这种情况。
所以这是图书馆方法的一个例子:
internal class MemberLogic : BaseLogic, IMemberLogic
{
public async Task<Member> AddOrUpdateAsync(string listId, Member member)
{
using (var client = this.CreateMailClient($"{BaseUrl}/"))
{
var response =
await
client.PutAsJsonAsync($"{listId}/members/{this.Hash(member.EmailAddress.ToLower())}", member, null).ConfigureAwait(false);
await response.EnsureSuccessMailChimpAsync().ConfigureAwait(false);
return await response.Content.ReadAsAsync<Member>().ConfigureAwait(false);
}
}
}
不是我从我的方法调用此方法,如:
public bool ListSubscribe(string email, string listId, string apiKey)
{
try
{
var api = new MailChimpManager(apiKey);
var profile = new Member();
profile.EmailAddress = emailAddress;
Member member = api.Members.AddOrUpdateAsync(listId, profile).Result;
}
catch(Exception ex)
{
throw;
}
return member != null;
}
代码死锁在调用异步方法的行:
Member member = api.Members.AddOrUpdateAsync(listId, profile).Result;
所以我的问题是我在从同步调用异步方法时遇到了什么问题?因为我无法让这个工作。
更新:
关于这些文章:
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
https://blog.ciber.no/2014/05/19/using-task-configureawaitfalse-to-prevent-deadlocks-in-async-code/
我应该可以像上面的例子一样使用它,只需设置.ConfigureAwait(false);
在标记为重复的问题中未提及的内容。
此外,我的代码正在使用其他一些异步方法。它只是不能使用这个方法,并且在异步方法中发生异常时会出现死锁。