Beispiel #1
0
 internal PipelineThread GetPipelineThread()
 {
     if (this.pipelineThread == null)
     {
         this.pipelineThread = new PipelineThread(base.ApartmentState);
     }
     return(this.pipelineThread);
 }
Beispiel #2
0
        protected override void StartPipelineExecution()
        {
            if (this._disposed)
            {
                throw LocalPipeline._trace.NewObjectDisposedException("pipeline");
            }
            this.useExternalInput = this.InputStream.IsOpen || this.InputStream.Count > 0;
            switch (this.LocalRunspace.ThreadOptions)
            {
            case PSThreadOptions.Default:
            case PSThreadOptions.UseNewThread:
                Thread invokeThread = new Thread(new ThreadStart(this.InvokeThreadProc), LocalPipeline.MaxStack);
                this.SetupInvokeThread(invokeThread, true);
                ApartmentState state = this.InvocationSettings == null || this.InvocationSettings.ApartmentState == ApartmentState.Unknown ? this.LocalRunspace.ApartmentState : this.InvocationSettings.ApartmentState;
                if (state != ApartmentState.Unknown)
                {
                    invokeThread.SetApartmentState(state);
                }
                invokeThread.Start();
                break;

            case PSThreadOptions.ReuseThread:
                if (this.IsNested)
                {
                    this.SetupInvokeThread(Thread.CurrentThread, true);
                    this.InvokeThreadProc();
                    break;
                }
                PipelineThread pipelineThread = this.LocalRunspace.GetPipelineThread();
                this.SetupInvokeThread(pipelineThread.Worker, true);
                pipelineThread.Start(new ThreadStart(this.InvokeThreadProc));
                break;

            case PSThreadOptions.UseCurrentThread:
                Thread      pipelineExecutionThread = this.NestedPipelineExecutionThread;
                CultureInfo currentCulture          = Thread.CurrentThread.CurrentCulture;
                CultureInfo currentUiCulture        = Thread.CurrentThread.CurrentUICulture;
                try
                {
                    this.SetupInvokeThread(Thread.CurrentThread, false);
                    this.InvokeThreadProc();
                    break;
                }
                finally
                {
                    this.NestedPipelineExecutionThread    = pipelineExecutionThread;
                    Thread.CurrentThread.CurrentCulture   = currentCulture;
                    Thread.CurrentThread.CurrentUICulture = currentUiCulture;
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Returns the thread that must be used to execute pipelines when CreateThreadOptions is ReuseThread
        /// </summary>
        /// <remarks>
        /// The pipeline calls this function after ensuring there is a single thread in the pipeline, so no locking is necessary
        /// </remarks>
        internal PipelineThread GetPipelineThread()
        {
            if (_pipelineThread == null)
            {
#if CORECLR     // No ApartmentState In CoreCLR
                _pipelineThread = new PipelineThread();
#else
                _pipelineThread = new PipelineThread(this.ApartmentState);
#endif
            }

            return _pipelineThread;
        }
Beispiel #4
0
 internal PipelineThread GetPipelineThread()
 {
     if (this.pipelineThread == null)
     {
         this.pipelineThread = new PipelineThread(base.ApartmentState);
     }
     return this.pipelineThread;
 }
Beispiel #5
0
        protected override void StartPipelineExecution()
        {
            Thread         thread;
            ApartmentState apartmentState;

            if (this._disposed)
            {
                throw PSTraceSource.NewObjectDisposedException("pipeline");
            }
            this.useExternalInput = base.InputStream.IsOpen || (base.InputStream.Count > 0);
            switch ((this.IsNested ? PSThreadOptions.UseCurrentThread : this.LocalRunspace.ThreadOptions))
            {
            case PSThreadOptions.Default:
            case PSThreadOptions.UseNewThread:
                thread = new Thread(new ThreadStart(this.InvokeThreadProc), MaxStack);
                this.SetupInvokeThread(thread, true);
                if ((base.InvocationSettings == null) || (base.InvocationSettings.ApartmentState == ApartmentState.Unknown))
                {
                    apartmentState = this.LocalRunspace.ApartmentState;
                    break;
                }
                apartmentState = base.InvocationSettings.ApartmentState;
                break;

            case PSThreadOptions.ReuseThread:
                if (!this.IsNested)
                {
                    PipelineThread pipelineThread = this.LocalRunspace.GetPipelineThread();
                    this.SetupInvokeThread(pipelineThread.Worker, true);
                    pipelineThread.Start(new ThreadStart(this.InvokeThreadProc));
                    return;
                }
                this.SetupInvokeThread(Thread.CurrentThread, true);
                this.InvokeThreadProc();
                return;

            case PSThreadOptions.UseCurrentThread:
            {
                Thread      nestedPipelineExecutionThread = base.NestedPipelineExecutionThread;
                CultureInfo currentCulture   = Thread.CurrentThread.CurrentCulture;
                CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
                try
                {
                    this.SetupInvokeThread(Thread.CurrentThread, false);
                    this.InvokeThreadProc();
                }
                finally
                {
                    base.NestedPipelineExecutionThread    = nestedPipelineExecutionThread;
                    Thread.CurrentThread.CurrentCulture   = currentCulture;
                    Thread.CurrentThread.CurrentUICulture = currentUICulture;
                }
                return;
            }

            default:
                return;
            }
            if (apartmentState != ApartmentState.Unknown)
            {
                thread.SetApartmentState(apartmentState);
            }
            thread.Start();
        }