Я решил это ... Проблема была в запросе гэппи, при получении событий. Я использовал неправильный calendarId. У меня установлено значение по умолчанию «основной», но фактический использованный ID календаря можно найти в разделе «Настройки Google Calendar» >> «Интегрировать календарь». В моих настройках calendarId был адресом электронной почты связанной учетной записи.
Таким образом, запрос гэппи выглядит так:
const fetchTimeLimit = new Date(2019, 0, 1).toISOString();
let events = await gapi.client.calendar.events.list({
calendarId: 'calendar_email@gmail.com',
timeMin: fetchTimeLimit,
showDeleted: false,
singleEvents: true,
maxResults: 300,
orderBy: 'startTime'
})
.then(response => { ........etc
Я думаю Пул потоков. QueueUserWorkItem - то, что Вы ищете. С добавлением лямбд и анонимных типов, это может быть действительно просто:
var request = new { url = externalServerUrl, input = urlEncodedUserInput };
ThreadPool.QueueUserWorkItem(
(data) =>
{
httpRequest = WebRequest.Create(data.url);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
bytedata = Encoding.UTF8.GetBytes(data.input);
httpRequest.ContentLength = bytedata.Length;
requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytedata, 0, bytedata.Length);
requestStream.Close();
//and so on
}, request);
Единственный способ, которым я могу представить, чтобы вы быстро ответили на другой запрос, - это открыть страницу, которую вы публикуете, для открытия потока с помощью ThreadPool.QueueUserWorkItem, чтобы основной поток завершает ответ до того, как завершится трудоемкая работа. Вы должны знать, что после выхода из основного потока у вас не будет доступа к HttpContext, что означает отсутствие кеширования, серверных переменных и т. Д. Также общие диски не будут работать, если вы не олицетворяете пользователя с разрешениями в новом потоке. Обсуждения хороши, но есть на что обратить внимание.