努力在ASP.net中部署异步工作

时间:2017-04-03 12:50:18

标签: c# asp.net async-await deadlock

代码在我的开发环境中运行良好,但在使用可扩展架构进行部署时,它似乎陷入僵局。

这里的目标是将一系列API请求发送到SendGrid,批量处理并逐个处理每个批处理。

首次来自ASHX处理程序

public void ProcessRequest(HttpContext context)
{
    var result = Code.Helpers.Email.Sendgrid.Queue.Process().Result;
    if (result.Success)
    {

Queue.Process()

public static async Task<GenericMethodResult> Process()
{
    var queueItems = GetQueueItemsToProcess();
    var batches = BatchQueueItems(queueItems);

    foreach (var batch in batches)
    {
        var r = await batch.SendToSendGrid();
        if (r.StopBatch)
        {
            break;
        }
    }

    return new GenericMethodResult(true);
}

SendToSendGrid()

public async Task<SendGridAPIMethodResponse> SendToSendGrid()
{
    var r = new SendGridAPIMethodResponse();
    var json = API.Functions.CreateJSONData(this);
    var sg = new SendGridClient(Settings.Email.SendgridAPIKey);

    dynamic response;
    if (Action == Action.UpdateRecipient)
    {
        response = await sg.RequestAsync(SendGridClient.Method.PATCH, urlPath: "contactdb/recipients", requestBody: json);
    }

    string jsonResponse = response.Body.ReadAsStringAsync().Result;
    // Process response...

    return r;
}

我尽可能多地删除了代码。

有人能够告诉我为什么这段代码会在生产中超时吗?

1 个答案:

答案 0 :(得分:2)

SendToSendGrid()中的string jsonResponse = response.Body.ReadAsStringAsync().Result; 进行阻止调用会导致死锁,因为您正在混合异步和阻止呼叫。

var jsonResponse = await response.Body.ReadAsStringAsync();

一直使用async

HttpTaskAsyncHandler

并尝试避免在异步方法中混合阻塞调用。

您还应该考虑使用public class MyHandler : HttpTaskAsyncHandler { public override async Task ProcessRequestAsync(HttpContext context) { var result = await Code.Helpers.Email.Sendgrid.Queue.Process(); if (result.Success) { //..other code } } } 来使您的处理程序异步。

if ('password' == $attrs.type) {
      const _interval = $interval(() => { //interval required, chrome takes some time to autofill
          if ($element.is(':-webkit-autofill')) { //jQuery.is()
              //your code
              $interval.cancel(_interval);
          }
      }, 500, 10); //0.5s, 10 times
}