internal PipelineThread GetPipelineThread() { if (this.pipelineThread == null) { this.pipelineThread = new PipelineThread(base.ApartmentState); } return(this.pipelineThread); }
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; } } }
/// <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; }
internal PipelineThread GetPipelineThread() { if (this.pipelineThread == null) { this.pipelineThread = new PipelineThread(base.ApartmentState); } return this.pipelineThread; }
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(); }