示例#1
0
        public void Start(ThreadActor actor, CancellationToken cancellationToken, string name = null)
        {
            cancellationToken.Register(this.Kill);
            name = name ?? $"Thread worker thread #{kDefaultThreadNameCounter++}";
            // Reset
            this.Kill();

            // Reset graceful shutdown indicators
            m_finishedGracefully        = false;
            m_gracefulShutdownIndicator = new TaskCompletionSource <bool>();

            // Create new data
            m_activeThreadData    = new ThreadWorkerDataTracker <TInput, TExecutionState, TOutput>(this.InputToProcess, this.ExecutionState, this.OutputResults);
            m_thread              = new Thread(new ParameterizedThreadStart(_Runner));
            m_thread.Name         = name;
            m_thread.IsBackground = true;
            m_thread.Start(m_activeThreadData);
            this.IsActiveChanged?.Invoke(this, EventArgs.Empty);

            void _Runner(object state)
            {
                actor((ThreadWorkerDataTracker <TInput, TExecutionState, TOutput>)state);
                m_finishedGracefully = true;
                var gracefulShutdownNotifier = m_gracefulShutdownIndicator;

                this.DeactivateAndCleanup();
                gracefulShutdownNotifier.TrySetResult(true);
            }
        }
示例#2
0
 private void DeactivateAndCleanup()
 {
     m_activeThreadData?.ExecutionState.DisposeAndClearDisposables();
     m_activeThreadData?.InputToProcess.DisposeAndClearDisposables();
     m_activeThreadData?.OutputResults.DisposeAndClearDisposables();
     m_thread                    = null;
     m_activeThreadData          = null;
     m_gracefulShutdownIndicator = null;
     this.IsActiveChanged?.Invoke(this, EventArgs.Empty);
 }
示例#3
0
        public void Kill()
        {
            if (m_thread == null)
            {
                m_activeThreadData = null;
                return;
            }

            if (!m_finishedGracefully)
            {
                m_thread.Abort();
            }

            this.DeactivateAndCleanup();
        }