private void CreateThread(TaskData task) { while (true) { task.WaitHandle.Wait(); if (task.ThreadRunning == false) { break; } if (task.Sql.Trim() == "") { task.WaitHandle.Reset(); continue; } var sw = new Stopwatch(); sw.Start(); try { task.Executing = true; task.IsGridLoaded = task.IsTextLoaded = task.IsParametersLoaded = false; _synchronizationContext.Post(new SendOrPostCallback(o => { this.LoadResult(task); }), task); task.Parameters = null; task.StartDateTime = DateTime.Now; using (var reader = _db.CreateCommand(task.Sql).ExecuteReader()) { task.ReadResult(reader); } task.EndDateTime = DateTime.Now; task.Elapsed = sw.Elapsed; task.Exception = null; task.Executing = false; // update form button selected _synchronizationContext.Post(new SendOrPostCallback(o => { var t = o as TaskData; if (this.ActiveTask?.Id == t.Id) { this.LoadResult(o as TaskData); } }), task); } catch (Exception ex) { task.Executing = false; task.Result = null; task.Elapsed = sw.Elapsed; task.Exception = ex; _synchronizationContext.Post(new SendOrPostCallback(o => { var t = o as TaskData; if (this.ActiveTask?.Id == t.Id) { tabResult.SelectedTab = tabText; this.LoadResult(o as TaskData); } }), task); } // put thread in wait mode task.WaitHandle.Reset(); } task.WaitHandle.Dispose(); }