diff Implab/TaskHelpers.cs @ 251:7c7e9ad6fe4a v3

Prerelease version of RunnableComponent Added draft messaging interfaces Added more more helpers to Xml/SerializationHelpers
author cin
date Sun, 11 Feb 2018 00:49:51 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Implab/TaskHelpers.cs	Sun Feb 11 00:49:51 2018 +0300
@@ -0,0 +1,70 @@
+using System;
+using System.Threading.Tasks;
+
+namespace Implab {
+    public static class TaskHelpers {
+
+        public static async Task Then(this Task that, Action fulfilled, Action<Exception> rejected) {
+            Safe.ArgumentNotNull(that, nameof(that));
+            if (rejected != null) {
+                try {
+                    await that;
+                } catch (Exception e) {
+                    rejected(e);
+                    return;
+                }
+            } else {
+                await that;
+            }
+
+            if (fulfilled != null)
+                fulfilled();
+        }
+
+        public static async Task Then(this Task that, Action fulfilled) {
+            Safe.ArgumentNotNull(that, nameof(that));
+            await that;
+            if (fulfilled != null)
+                fulfilled();
+        }
+
+        public static async Task Then(this Task that, Func<Task> fulfilled) {
+            Safe.ArgumentNotNull(that, nameof(that));
+            await that;
+            if (fulfilled != null)
+                await fulfilled();
+        }
+
+        public static async Task Finally(this Task that, Action handler) {
+            Safe.ArgumentNotNull(that, nameof(that));
+            try {
+                await that;
+            } finally {
+                if (handler != null)
+                    handler();
+            }
+        }
+
+        public static async void Then(this Task that, IResolvable next) {
+            try {
+                await that;
+            } catch (Exception e) {
+                next.Reject(e);
+                return;
+            }
+            next.Resolve();
+        }
+
+        public static async void Then<T>(this Task<T> that, IResolvable<T> next) {
+            T result;
+            try {
+                result = await that;
+            } catch (Exception e) {
+                next.Reject(e);
+                return;
+            }
+            next.Resolve(result);
+        }
+
+    }
+}
\ No newline at end of file