void DownloadThread(CallerInfo caller)
{
caller.app->isProgressCanceled = false;
String result;
result << "Download started, timeout is set to 30 seconds...";
caller.app->downloadResult.Set(result);
caller.app->tab.RefreshFrame();
is MT broken -> first, U++ does not allow to call GUI related things from other than the main thread (we the exception of callback queue). And even if it would, you would still need some mutex for caller.app.
Solution: Instead of calling caller.app methods directly, use callback queue; calling SetTimeCallback is legal at any moment (queue is serialized - there is mutex inside). Set the delay parameter = 0 so that it gets invoked at first oportunity.