teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

試したことの追記

2018/11/07 09:26

投稿

kmyzr
kmyzr

スコア305

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