Обрабатывать асинхронный обратный вызов пакетных запросов в.NET 4 и WebForms

В приведенном примере вы видите, что я выполняю пакетный запрос по нажатию кнопки. После этого мне нужно использовать информацию, предоставленную в обратном вызове, но не замораживая страницу WebForms. Я думал, что обратный вызов сам по себе асинхронный, но, очевидно, я ошибаюсь, потому что, пока обратный вызов не обработан, страница остается замороженной.

batchRequest.Queue<Google.Apis.Calendar.v3.Data.Event>(
    addRequest,
    (content, error, i, message) =>    // callback
    {
        using (dbContext)
        {
            Event eventToUpdate = dbContextNewInstance.Events.FirstOrDefault(x => x.Id == dbObj.Id);
            if (eventToUpdate != null)
            {
                eventToUpdate.GoogleCalendarMappingId = content.Id;
                dbContextNewInstance.SubmitChanges();
            }
        }
    });

batchRequest.ExecuteAsync();

* ОБНОВЛЕНИЕ: я сделал эту реализацию, и она работала! Пока я волнуюсь, все ли идет правильно, и ни одно из потоков или соединение с БД не остается неуправляемым, ребята?

batchRequest.Queue<Google.Apis.Calendar.v3.Data.Event>(
                                 addRequest,
                                 (content, error, i, message) =>    // callback
                                 {
                                     idsToMap[dbObj.Id] = content.Id; // A dictionary for my dbObj Id and the Id I receive from the remote API in the CALLBACK
                                 });


                Thread batchThread = new Thread(() => SubmitBatchRequest(batchRequest, idsToMap, connectionString));
            batchThread.Start();

И метод с темой:

private static void SubmitBatchRequest(BatchRequest batchRequest, Dictionary<Guid, string> ids, string connectionString)
{
    Thread.CurrentThread.IsBackground = true;

    batchRequest.ExecuteAsync().GetAwaiter().GetResult(); // Send the batch request asynchronous

    using (DataContext db = new DataContext(connectionString))
    {
        foreach (Guid dbObjId in ids.Keys)
        {
            Event eventToUpdate = db.Events.FirstOrDefault(x => x.Id == dbObjId);
            if (eventToUpdate != null)
            {
                eventToUpdate.GoogleCalendarMappingId = ids[dbObjId];
            }
        }

        // Thread.Sleep(50000);
        db.SubmitChanges();
    }
}

0 ответов

Другие вопросы по тегам