private void DoTask(Task task) { RunWorkerCompletedEventArgs resultArgs; try { var args = new DoWorkEventArgs(task.Argument); task.Do(task, args); resultArgs = new RunWorkerCompletedEventArgs(args.Result, null, false); } catch (Exception e) { resultArgs = new RunWorkerCompletedEventArgs(null, e, false); } if (task.Completed != null) synchronizationContext.Post(state => task.Completed(task, resultArgs), resultArgs); }