Esempio n. 1
0
        /// <summary>
        /// Creates a micro thread out of the specified function and schedules it as last micro thread to run in this scheduler.
        /// Note that in case of multithreaded scheduling, it might start before this function returns.
        /// </summary>
        /// <param name="microThreadFunction">The function to create a micro thread from.</param>
        /// <param name="flags">The flags.</param>
        /// <returns>A micro thread.</returns>
        public MicroThread Add(Func <Task> microThreadFunction, MicroThreadFlags flags = MicroThreadFlags.None)
        {
            var microThread = new MicroThread(this, flags);

            microThread.Start(microThreadFunction);
            return(microThread);
        }
 public void OnCompleted(Action continuation)
 {
     microThread = scheduler.Add(() =>
     {
         continuation();
         return(Task.FromResult(true));
     });
 }
Esempio n. 3
0
        public static ChannelMicroThreadAwaiter <T> New(MicroThread microThread)
        {
            lock (pool)
            {
                if (pool.Count > 0)
                {
                    var index    = pool.Count - 1;
                    var lastItem = pool[index];
                    pool.RemoveAt(index);

                    lastItem.MicroThread = microThread;

                    return(lastItem);
                }

                return(new ChannelMicroThreadAwaiter <T>(microThread));
            }
        }
Esempio n. 4
0
        public T GetResult()
        {
            // Check Task Result (exception, etc...)
            MicroThread.CancellationToken.ThrowIfCancellationRequested();

            var result = Result;

            // After result has been taken, we can reuse this item, so put it in the pool
            // We mitigate pool size, but another approach than hard limit might be interesting
            lock (pool)
            {
                if (pool.Count < 4096)
                {
                    isCompleted  = false;
                    MicroThread  = null;
                    Continuation = null;
                    Result       = default(T);
                }

                pool.Add(this);
            }

            return(result);
        }
Esempio n. 5
0
 public ChannelMicroThreadAwaiter(MicroThread microThread)
 {
     MicroThread = microThread;
 }
 public MicroThreadSynchronizationContext(MicroThread microThread)
 {
     this.microThread = microThread;
 }
 public SwitchMicroThread(MicroThread microThread)
 {
     this.microThread = microThread;
     //microThread.SynchronizationContext.IncrementTaskCount();
 }
 public SwitchToAwaiter(Scheduler scheduler)
 {
     this.scheduler   = scheduler;
     this.microThread = null;
 }
Esempio n. 9
0
 public MicroThreadYieldAwaiter(MicroThread microThread)
 {
     this.microThread = microThread;
 }
Esempio n. 10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SchedulerThreadEventArgs"/> class.
 /// </summary>
 /// <param name="microThread">The micro thread.</param>
 /// <param name="threadId">The managed thread identifier.</param>
 public SchedulerThreadEventArgs(MicroThread microThread, int threadId)
 {
     MicroThread = microThread;
     ThreadId    = threadId;
 }
Esempio n. 11
0
 public SchedulerEntry(MicroThread microThread) : this()
 {
     MicroThread = microThread;
 }