异步任务没有返回主线程

Man*_*kar 0 c# asp.net-mvc async-await

我认为这与我非常糟糕的异步编程有关.

在这里.我使用异步方法获取mailchimp订阅者但结果只是挂起并且永远不会返回主线程.

异步方法

public async Task<List<Subscriber>> GetMailChimpSubscribers()
{
    TaskCompletionSource<List<Subscriber>> result = new TaskCompletionSource<List<Subscriber>>();
    await Task.Run(async () =>
    {
        var subscribers = new List<Subscriber>();
        var listId = "";
        var members = await _manager.Members.GetAllAsync(listId);
        foreach (var item in members)
        {
            var sub = new Subscriber();
            sub.Email = item.EmailAddress;
            subscribers.Add(sub);
        }
        result.SetResult(subscribers);
    });
    return result.Task.Result;
}
Run Code Online (Sandbox Code Playgroud)

这完全挂在result.SetResult(subscriber)语句之后.

这是从

public static List<Subscriber> GetSubscribers()
{
    MailchimpHelper helper = new MailchimpHelper();
    var subscribers= helper.GetMailChimpSubscribers();

    return subscribers.Result;
}
Run Code Online (Sandbox Code Playgroud)

这到底出了什么问题?设置错了吗?

PS:mailchimp或api没有问题,它在控制台中运行良好.这对于异步编程来说纯粹是坏事

更新:

如果有人遇到这种情况.博客帮助澄清了很多

https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

来自下面的工作解决方案和博客.

public async Task<List<Subscriber>> GetMailChimpSubscribers()
   {
    var subscribers = new List<Subscriber>();
    var listId = "";
    var members = 
     await   _manager.Members.GetAllAsync(listId).**ConfigureAwait(false)**;

    foreach (var item in members)
    {
        var sub = new Subscriber();
        sub.Email = item.EmailAddress;
        subscribers.Add(sub);
    }

    return subscribers;


} 

public static List<Subscriber> GetSubscribers()
{
    MailchimpHelper helper = new MailchimpHelper();
    var subscribers= helper.GetMailChimpSubscribers();
    subscribers.Wait();

    return subscribers.Result;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 8

这里有很多错误:

删除所有坏的部分给我们留下了:

public async Task<List<Subscriber>> GetMailChimpSubscribersAsync()
{
  var subscribers = new List<Subscriber>();
  var listId = "";
  var members = await _manager.Members.GetAllAsync(listId);
  foreach (var item in members)
  {
    var sub = new Subscriber();
    sub.Email = item.EmailAddress;
    subscribers.Add(sub);
  }
  return subscribers;
}

public static async Task<List<Subscriber>> GetSubscribersAsync()
{
  MailchimpHelper helper = new MailchimpHelper();
  return await helper.GetMailChimpSubscribersAsync();
}
Run Code Online (Sandbox Code Playgroud)

  • @MandarJogalekar调用razor文件中的代码没有任何意义,为什么你不从控制器动作调用它并将它传递给viewmodel?或者你为什么不从客户端发出ajax请求? (2认同)