fine-grained runReadAction calls to avoid UI locking