ASP.NET MVC - 从同步方法死锁调用异步方法

时间:2016-08-16 14:27:45

标签: c# asp.net-mvc asynchronous mailchimp

我使用此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);

在标记为重复的问题中未提及的内容。

此外,我的代码正在使用其他一些异步方法。它只是不能使用这个方法,并且在异步方法中发生异常时会出现死锁。

0 个答案:

没有答案