Beispiel #1
0
        public override async ValueTask <long> CalcSomething()
        {
            Console.WriteLine("Got to wait long time");
            var ret = await CustomAwaiter.TryTCSAwaiter();

            return(await ValueTask.FromResult(ret));
        }
Beispiel #2
0
        /// <summary>
        /// 2.5 WhenAny; note that when first task completes, others continue work
        /// </summary>
        /// <param name="span"></param>
        /// <returns></returns>
        public static async Task CalcUntilTimeout(TimeSpan span)
        {
            Console.WriteLine($"Starting with timeout span in seconds = {span.TotalSeconds}");
            using var cts = new CancellationTokenSource(span);
            CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
            Task <long>             work = CustomAwaiter.TryAwaitCustomType(cancelTokenSource.Token);
            Task timeout = Task.Delay(Timeout.InfiniteTimeSpan, cts.Token);

            try
            {
                //both Tasks will work to completion until something cancels work!
                Task completedTask = await Task.WhenAny(timeout, work);

                if (completedTask == timeout)
                {
                    cancelTokenSource.Cancel();
                    Console.WriteLine("Timeout task completed before calculations");
                }
                else
                {
                    Console.WriteLine($"Got {work.Result} from WhenAll Task");
                }
            }
            catch (TaskCanceledException)
            {
                Console.WriteLine("TaskCanceledException");
            }
        }
Beispiel #3
0
    public static void Explain(this CustomAwaiter runnable, TextWriter writer)
    {
        writer.WriteLine(@"
- Anything can be awaited with the `GetAwaiter` (istance|static) convention
- Presence of the method (even in the library) makes things awaitable
- i.ex. allow to `await Process.Start`
");
    }
Beispiel #4
0
        public static async Task <long> SwitchOnContext()
        {
            PrintThread("before calling, with configure");
            var ret = await CustomAwaiter.TryTCSAwaiter().ConfigureAwait(false);

            PrintThread("after calling, with configure");
            return(ret);
        }
Beispiel #5
0
        public static async Task <long> SameContext()
        {
            PrintThread("before calling, without configure");
            var ret = await CustomAwaiter.TryTCSAwaiter();

            PrintThread("after calling, without configure");
            return(ret);
        }
Beispiel #6
0
        //also there is AsyncEx lib with OrderByCompletion method
        //it returns array of tasks which will complete in order
        public static async Task <long> Calc()
        {
            List <Task <long> > tasks = new List <Task <long> >();

            foreach (var unused in Enumerable.Range(0, 5))
            {
                tasks.Add(CustomAwaiter.TryAwaitCustomType(CancellationToken.None));
            }

            long acc = 0L;

            foreach (var t in tasks)
            {
                //wait for tasks in parallel, but we dont care which finishes first
                //because we process results sequentially
                var ret = await t;
                acc += ret;
            }

            // var test = tasks.Select(async tq =>
            // {
            //     var ret = await tq;
            //     acc += ret;
            // }).ToArray();
            // await Task.WhenAll(test);


            async Task <int> DelayAndReturn(int val)
            {
                await Task.Delay(val);

                return(val);
            }

            var tasks1 = new[] { DelayAndReturn(200), DelayAndReturn(400), DelayAndReturn(100) };
            var proc   = tasks1.Select(async t =>
            {
                var r = await t;
                Console.WriteLine(r);
            }).ToArray();             //start all tasks
            await Task.WhenAll(proc); //and wait for them to finish

            //100-200-400 because all tasks work in parallel

            //wait one task after another
            var tasks2 = new[] { DelayAndReturn(200), DelayAndReturn(400), DelayAndReturn(100) };

            foreach (var task in tasks2)
            {
                var r = await task;
                Console.WriteLine(r);
            }
            //200-400-100 because tasks are started one after another
            return(acc);
        }
Beispiel #7
0
        public static async Task CalcWithDelays()
        {
            for (int i = 0; i < 3; i++)
            {
                var current = DateTime.Now;
                await CustomAwaiter.TryAwaitCustomType(CancellationToken.None);

                await Task.Delay(i *1500);

                Console.WriteLine($"Total time was {(DateTime.Now -current).TotalMilliseconds} + with current delay {i*1500}");
            }
        }
        /// <summary>
        /// Lädt das Universum mit der angegebenen Guid.
        /// </summary>
        /// <param name="universeGuid">Die Guid des Universums.</param>
        /// <returns>Das geladene Universum.</returns>
        public Awaiter Load(out IUniverse universe, Guid universeGuid)
        {
            string file = Path.Combine(GetRoot(), universeGuid.ToString(), UniverseFilename);

            universe = new Universe();
            if (!File.Exists(file))
            {
                return(null);
            }
            var tcs = new CustomAwaiter();

            using (Stream stream = File.Open(file, FileMode.Open, FileAccess.Read))
                using (GZipStream zip = new GZipStream(stream, CompressionMode.Decompress))
                    using (var reader = new BinaryReader(zip))
                    {
                        var awaiter = new Awaiter();
                        awaiter.Serializable = universe;
                        universe.Deserialize(reader, null);
                        awaiter.SetResult(universe);
                        return(awaiter);
                    }
        }
Beispiel #9
0
            public void MoveNext()
            {
                int num         = _state;
                var taskAwaiter = new CustomAwaiter();

                if (num != 0)
                {
                    if (!taskAwaiter.IsCompleted)
                    {
                        _state       = 0;
                        _taskAwaiter = taskAwaiter;
                        AsyncStateMachine state = this;
                        _builder.AwaitOnCompleted(ref taskAwaiter, ref state);
                        return;
                    }
                }
                var res = taskAwaiter.GetResult();

                taskAwaiter = null;

                _state = -2;
                _builder.SetResult(res);
            }
Beispiel #10
0
 public override Task <long> CalcSomething()
 {
     Console.WriteLine("Got to wait long time");
     return(CustomAwaiter.TryTCSAwaiter());
 }