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)
这里有很多错误:
TaskCompletionSource<T>.Task.Run也是不必要的.删除所有坏的部分给我们留下了:
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)