1
1
using System ;
2
2
using System . Management . Automation ;
3
+ using System . Management . Automation . Runspaces ;
3
4
4
5
namespace PSParallel
5
6
{
6
7
class PowerShellPoolMember : IDisposable
7
8
{
8
- private readonly PowershellPool m_pool ;
9
- private readonly int m_index ;
10
- private readonly PowerShellPoolStreams m_poolStreams ;
11
- private PowerShell m_powerShell ;
12
- public PowerShell PowerShell => m_powerShell ;
13
- public int Index => m_index ;
14
-
15
- private readonly PSDataCollection < PSObject > m_input = new PSDataCollection < PSObject > ( ) ;
16
- private PSDataCollection < PSObject > m_output ;
17
- private int m_percentComplete ;
9
+ private readonly PowershellPool _pool ;
10
+ private readonly int _index ;
11
+ private readonly PowerShellPoolStreams _poolStreams ;
12
+ private readonly Runspace _runspace ;
13
+ private PowerShell _powerShell ;
14
+ public PowerShell PowerShell => _powerShell ;
15
+ public int Index => _index ;
16
+
17
+ private readonly PSDataCollection < PSObject > _input = new PSDataCollection < PSObject > ( ) ;
18
+ private PSDataCollection < PSObject > _output ;
19
+ private int _percentComplete ;
18
20
public int PercentComplete
19
21
{
20
- get { return m_percentComplete ; }
21
- set { m_percentComplete = value ; }
22
+ get { return _percentComplete ; }
23
+ set { _percentComplete = value ; }
22
24
}
23
25
24
26
25
- public PowerShellPoolMember ( PowershellPool pool , int index )
27
+ public PowerShellPoolMember ( PowershellPool pool , int index , Runspace runspace )
26
28
{
27
- m_pool = pool ;
28
- m_index = index ;
29
- m_poolStreams = m_pool . Streams ;
30
- m_input . Complete ( ) ;
29
+ _pool = pool ;
30
+ _index = index ;
31
+ _runspace = runspace ;
32
+ _runspace . Open ( ) ;
33
+ _poolStreams = _pool . Streams ;
34
+ _input . Complete ( ) ;
31
35
CreatePowerShell ( ) ;
32
36
}
33
37
@@ -37,34 +41,35 @@ private void PowerShellOnInvocationStateChanged(object sender, PSInvocationState
37
41
{
38
42
case PSInvocationState . Stopped :
39
43
ReleasePowerShell ( ) ;
40
- m_pool . ReportStopped ( this ) ;
44
+ _pool . ReportStopped ( this ) ;
41
45
break ;
42
46
case PSInvocationState . Completed :
43
47
case PSInvocationState . Failed :
44
48
ReleasePowerShell ( ) ;
45
49
CreatePowerShell ( ) ;
46
- m_pool . ReportAvailable ( this ) ;
50
+ _pool . ReportAvailable ( this ) ;
47
51
break ;
48
52
}
49
53
}
50
54
51
55
private void CreatePowerShell ( )
52
56
{
53
57
var powerShell = PowerShell . Create ( ) ;
58
+ powerShell . Runspace = _runspace ;
54
59
HookStreamEvents ( powerShell . Streams ) ;
55
60
powerShell . InvocationStateChanged += PowerShellOnInvocationStateChanged ;
56
- m_powerShell = powerShell ;
57
- m_output = new PSDataCollection < PSObject > ( ) ;
58
- m_output . DataAdded += OutputOnDataAdded ;
61
+ _powerShell = powerShell ;
62
+ _output = new PSDataCollection < PSObject > ( ) ;
63
+ _output . DataAdded += OutputOnDataAdded ;
59
64
}
60
65
61
66
private void ReleasePowerShell ( )
62
67
{
63
- UnhookStreamEvents ( m_powerShell . Streams ) ;
64
- m_powerShell . InvocationStateChanged -= PowerShellOnInvocationStateChanged ;
65
- m_output . DataAdded -= OutputOnDataAdded ;
66
- m_powerShell . Dispose ( ) ;
67
- m_powerShell = null ;
68
+ UnhookStreamEvents ( _powerShell . Streams ) ;
69
+ _powerShell . InvocationStateChanged -= PowerShellOnInvocationStateChanged ;
70
+ _output . DataAdded -= OutputOnDataAdded ;
71
+ _powerShell . Dispose ( ) ;
72
+ _powerShell = null ;
68
73
}
69
74
70
75
@@ -92,90 +97,96 @@ private void UnhookStreamEvents(PSDataStreams streams)
92
97
93
98
public void BeginInvoke ( ScriptBlock scriptblock , PSObject inputObject )
94
99
{
95
- m_percentComplete = 0 ;
100
+ _percentComplete = 0 ;
96
101
string command = $ "param($_,$PSItem, $PSPArallelIndex,$PSParallelProgressId){ scriptblock } ";
97
- m_powerShell . AddScript ( command )
102
+ _powerShell . AddScript ( command )
98
103
. AddParameter ( "_" , inputObject )
99
104
. AddParameter ( "PSItem" , inputObject )
100
- . AddParameter ( "PSParallelIndex" , m_index )
101
- . AddParameter ( "PSParallelProgressId" , m_index + 1000 ) ;
102
- m_powerShell . BeginInvoke ( m_input , m_output ) ;
105
+ . AddParameter ( "PSParallelIndex" , _index )
106
+ . AddParameter ( "PSParallelProgressId" , _index + 1000 ) ;
107
+ _powerShell . BeginInvoke ( _input , _output ) ;
108
+ }
109
+
110
+ internal void Reset ( )
111
+ {
112
+ _runspace . ResetRunspaceState ( ) ;
103
113
}
104
114
105
115
public void Dispose ( )
106
116
{
107
- var ps = m_powerShell ;
117
+ var ps = _powerShell ;
108
118
if ( ps != null )
109
119
{
110
120
UnhookStreamEvents ( ps . Streams ) ;
111
121
ps . Dispose ( ) ;
112
122
}
113
- m_output . Dispose ( ) ;
114
- m_input . Dispose ( ) ;
123
+ _output . Dispose ( ) ;
124
+ _input . Dispose ( ) ;
125
+ _runspace . Dispose ( ) ;
115
126
}
116
127
117
128
private void OutputOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
118
129
{
119
130
var item = ( ( PSDataCollection < PSObject > ) sender ) [ dataAddedEventArgs . Index ] ;
120
- m_poolStreams . Output . Add ( item ) ;
131
+ _poolStreams . Output . Add ( item ) ;
121
132
}
122
133
123
134
124
135
private void InformationOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
125
136
{
126
137
var ir = ( ( PSDataCollection < InformationRecord > ) sender ) [ dataAddedEventArgs . Index ] ;
127
- m_poolStreams . Information . Add ( ir ) ;
138
+ _poolStreams . Information . Add ( ir ) ;
128
139
}
129
140
130
141
private void ProgressOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
131
142
{
132
143
var record = ( ( PSDataCollection < ProgressRecord > ) sender ) [ dataAddedEventArgs . Index ] ;
133
- m_percentComplete = record . PercentComplete ;
134
- m_poolStreams . AddProgress ( record , m_index ) ;
144
+ _percentComplete = record . PercentComplete ;
145
+ _poolStreams . AddProgress ( record , _index ) ;
135
146
}
136
147
137
148
private void ErrorOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
138
149
{
139
150
var record = ( ( PSDataCollection < ErrorRecord > ) sender ) [ dataAddedEventArgs . Index ] ;
140
- m_poolStreams . Error . Add ( record ) ;
151
+ _poolStreams . Error . Add ( record ) ;
141
152
}
142
153
143
154
private void DebugOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
144
155
{
145
156
var record = ( ( PSDataCollection < DebugRecord > ) sender ) [ dataAddedEventArgs . Index ] ;
146
- m_poolStreams . Debug . Add ( record ) ;
157
+ _poolStreams . Debug . Add ( record ) ;
147
158
}
148
159
149
160
private void WarningOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
150
161
{
151
162
var record = ( ( PSDataCollection < WarningRecord > ) sender ) [ dataAddedEventArgs . Index ] ;
152
- m_poolStreams . Warning . Add ( record ) ;
163
+ _poolStreams . Warning . Add ( record ) ;
153
164
}
154
165
155
166
private void VerboseOnDataAdded ( object sender , DataAddedEventArgs dataAddedEventArgs )
156
167
{
157
168
var record = ( ( PSDataCollection < VerboseRecord > ) sender ) [ dataAddedEventArgs . Index ] ;
158
- m_poolStreams . Verbose . Add ( record ) ;
169
+ _poolStreams . Verbose . Add ( record ) ;
159
170
}
160
171
161
172
public void Stop ( )
162
173
{
163
- if ( m_powerShell . InvocationStateInfo . State != PSInvocationState . Stopped )
174
+ if ( _powerShell . InvocationStateInfo . State != PSInvocationState . Stopped )
164
175
{
165
- UnhookStreamEvents ( m_powerShell . Streams ) ;
166
- m_powerShell . BeginStop ( OnStopped , null ) ;
176
+ UnhookStreamEvents ( _powerShell . Streams ) ;
177
+ _powerShell . BeginStop ( OnStopped , null ) ;
167
178
}
168
179
}
169
180
170
181
private void OnStopped ( IAsyncResult ar )
171
182
{
172
- var ps = m_powerShell ;
183
+ var ps = _powerShell ;
173
184
if ( ps == null )
174
185
{
175
186
return ;
176
187
}
177
188
ps . EndStop ( ar ) ;
178
- m_powerShell = null ;
189
+ _powerShell = null ;
179
190
}
180
191
}
181
192
}
0 commit comments