代码在我的开发环境中运行良好,但在使用可扩展架构进行部署时,它似乎陷入僵局。
这里的目标是将一系列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;
}
我尽可能多地删除了代码。
有人能够告诉我为什么这段代码会在生产中超时吗?
答案 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
}