private void TaskErrorHandler(object sender, TaskExceptionEventArgs args) { if (OutputStream != null) { OutputStream.WriteError(args.TaskId, args.Exception); } }
/// <summary> /// Run async task /// </summary> /// <param name="task">Task operation</param> /// <param name="taskId">Task id</param> protected async void RunConcurrentTask(long taskId, Task task) { bool initTaskStatus = false; bool finishedTaskStatus = true; Interlocked.Increment(ref activeTaskCount); try { TaskStatus.TryAdd(taskId, initTaskStatus); await task.ConfigureAwait(false); Interlocked.Increment(ref finishedTaskCount); } catch (Exception e) { Interlocked.Increment(ref failedTaskCount); if (OnError != null) { TaskExceptionEventArgs eventArgs = new TaskExceptionEventArgs(taskId, e); try { OnError(this, eventArgs); } catch (Exception devException) { Debug.Fail(devException.Message); } } } finally { TaskStatus.TryUpdate(taskId, finishedTaskStatus, initTaskStatus); } Interlocked.Decrement(ref activeTaskCount); taskCounter.Signal(); RunRemainingTask(); }
/// <summary> /// Run async task /// </summary> /// <param name="task">Task operation</param> /// <param name="taskId">Task id</param> protected async void RunConcurrentTask(long taskId, Task task) { bool initTaskStatus = false; bool finishedTaskStatus = true; Interlocked.Increment(ref activeTaskCount); try { TaskStatus.TryAdd(taskId, initTaskStatus); await task.ConfigureAwait(false); Interlocked.Increment(ref finishedTaskCount); } catch (Exception e) { Interlocked.Increment(ref failedTaskCount); if (OnError != null) { TaskExceptionEventArgs eventArgs = new TaskExceptionEventArgs(taskId, e); try { OnError(this, eventArgs); } catch(Exception devException) { Debug.Fail(devException.Message); } } } finally { TaskStatus.TryUpdate(taskId, finishedTaskStatus, initTaskStatus); } Interlocked.Decrement(ref activeTaskCount); taskCounter.Signal(); RunRemainingTask(); }