Process batch request callback asynchronous in .NET 4 and WebForms

239 views Asked by At

In the example blow you can see I'm executing a batch request on a button click. After that I need to use the information provided in the callback, but without freezing the WebForms page. I have thought that the callback is asynchronous by itself, but obviously I'm wrong, because until the callback is not processed the page stays frozen.

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();

*UPDATE: I have made this implementation and its worked! So far I am worried is it everything going the correct way and no thread or DB connection is left unmanaged, guys?

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();

And the method with the Thread:

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

There are 0 answers