the way you have found the solution is not as optimize. as you know if you used the Thread then in case of increasing calls it will hamper the performance. I have similar problem. What i have done is I used
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ActivityInfo);
that helped me to que the request. Once you que the request as per the available thread it will pass your operation to the function execut from the queue.now in that queue if the request is executed then update the value
void ThreadProc(Object stateInfo)
IsWorkFinsh = UpdateGridWithNewData((CallLogHistory)stateInfo);
now create one Async Method and pass this value to async method. in your Async end method you can update isWorkFinish.
I have suggested the .Net Fremworks ThreadPool because it is optimized and you no need to handle any thing.