質問編集履歴
1
試したことの追記
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
PowerShellで 非同期処理 での データ
|
1
|
+
PowerShellで 非同期処理 での ref変数へのデータ追加が無視される事があるのですが 確実にref変数へのデータ追加は出来ないのでしょうか?
|
body
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
-
非同期で実行した処理結果を参照渡しの変数に
|
3
|
+
非同期で実行した処理結果を参照渡しの変数に追加
|
4
4
|
|
5
5
|
### 発生している問題
|
6
6
|
|
7
|
-
|
7
|
+
データの追加がされていないことがある上に
|
8
8
|
エラーも発生しない
|
9
9
|
|
10
10
|
### 問題 確認用 サンプルソースコード
|
@@ -205,8 +205,103 @@
|
|
205
205
|
実行するたびに登録されたデータ数が変わる...
|
206
206
|
|
207
207
|
ひとまず `ref`つかっての受け取りは諦めて
|
208
|
-
処理完了後にシリアル処理で戻り値を順に変数に格納しようと思っています。
|
208
|
+
処理完了後にシリアル処理で戻り値を順に変数に格納~~しようと思っています。~~しました。
|
209
|
+
```powershell
|
209
210
|
|
211
|
+
|
212
|
+
function _New_MultiThread()
|
213
|
+
{
|
214
|
+
[OutputType([_MultiThread])]
|
215
|
+
$Thread = New-Object _MultiThread($host)
|
216
|
+
return $Thread
|
217
|
+
}
|
218
|
+
|
219
|
+
|
220
|
+
#検索対象データの読み込み
|
221
|
+
$_Sarch_List_Read = {
|
222
|
+
|
223
|
+
Param
|
224
|
+
(
|
225
|
+
# 読み込む二次元配列
|
226
|
+
[Parameter(Mandatory,
|
227
|
+
Position=0)]
|
228
|
+
$Ary,
|
229
|
+
|
230
|
+
# 読み込み開始位置
|
231
|
+
[Parameter(Mandatory,
|
232
|
+
Position=1)]
|
233
|
+
[int]
|
234
|
+
$Start,
|
235
|
+
|
236
|
+
# 読み込み終了位置
|
237
|
+
[Parameter(Mandatory,
|
238
|
+
Position=2)]
|
239
|
+
[int]
|
240
|
+
$End
|
241
|
+
)
|
242
|
+
for ($i = $Start; $i -le $End; $i++)
|
243
|
+
{
|
244
|
+
$CSV_Data = New-Object psobject | select -Property No,Category,Type,PutName,ListPrice,Purchase,PrimeCost,SellingPrice,Maker,DisplayOrderNo,EquipmentName,CharacterSymbol
|
245
|
+
$CSV_Data.No = $Ary[$i,1]
|
246
|
+
$CSV_Data.Category = $Ary[$i,2]
|
247
|
+
$CSV_Data.Type = $Ary[$i,3]
|
248
|
+
$CSV_Data.PutName = $Ary[$i,4]
|
249
|
+
$CSV_Data.ListPrice = $Ary[$i,5]
|
250
|
+
$CSV_Data.Purchase = $Ary[$i,6]
|
251
|
+
$CSV_Data.PrimeCost = $Ary[$i,7]
|
252
|
+
$CSV_Data.SellingPrice = $Ary[$i,8]
|
253
|
+
$CSV_Data.Maker = $Ary[$i,9]
|
254
|
+
$CSV_Data.DisplayOrderNo = $Ary[$i,10]
|
255
|
+
$CSV_Data.EquipmentName = $Ary[$i,11]
|
256
|
+
$CSV_Data.CharacterSymbol = $Ary[$i,12]
|
257
|
+
|
258
|
+
$CSV_Data
|
259
|
+
|
260
|
+
}
|
261
|
+
}
|
262
|
+
|
263
|
+
# 20000 x 12 の配列を作成 元がExcelから持ってきてるので 添え字は1から始まりと仮定する
|
264
|
+
$Ary = New-Object -TypeName 'System.Object[,]' -ArgumentList 20001,13
|
265
|
+
$i = 0
|
266
|
+
|
267
|
+
# 適当にデータ代入
|
268
|
+
foreach ($item in $Ary)
|
269
|
+
{
|
270
|
+
$_ = $i
|
271
|
+
$i++
|
272
|
+
}
|
273
|
+
|
274
|
+
|
275
|
+
$MultiThread = _New_MultiThread
|
276
|
+
|
277
|
+
Write-Host "検索テーブルを読み込んでいます..."
|
278
|
+
$Max = $Ary.GetUpperBound(0)
|
279
|
+
Write-host "対象データ行数 = $($Max)"
|
280
|
+
$Step = 2000
|
281
|
+
for ($i = 1; $i -le $Max; $i+=$Step)
|
282
|
+
{
|
283
|
+
if ($($i + $Step - 1) -le $Max)
|
284
|
+
{
|
285
|
+
$End = $($i + $Step - 1)
|
286
|
+
}
|
287
|
+
else
|
288
|
+
{
|
289
|
+
$End = $Max
|
290
|
+
}
|
291
|
+
$MultiThread.AddThread($_Sarch_List_Read,[ordered]@{
|
292
|
+
Ary = $Ary
|
293
|
+
Start = $i
|
294
|
+
End = $End
|
295
|
+
})
|
296
|
+
}
|
297
|
+
|
298
|
+
while (!($MultiThread.AllCompleted)){}
|
299
|
+
$Search = @($MultiThread.GetResult() | foreach {$_})
|
300
|
+
$MultiThread.Dispose()
|
301
|
+
Write-host "登録されたデータ数 = $($Search.Count)"
|
302
|
+
|
303
|
+
```
|
304
|
+
|
210
305
|
### 補足情報(FW/ツールのバージョンなど)
|
211
306
|
|
212
307
|
Win10
|