質問編集履歴

1

試したことの追記

2018/11/07 09:26

投稿

kamikazelight
kamikazelight

スコア305

test CHANGED
@@ -1 +1 @@
1
- PowerShellで 非同期処理 での データ記(+=)しばしば無視される のを 回避たい
1
+ PowerShellで 非同期処理 での ref変数へのデータ追が無視される事があるのですが 確実にref変数へデータ追加は出来ないのでょうか?
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 非同期で実行した処理結果を参照渡しの変数にまとめたい
5
+ 非同期で実行した処理結果を参照渡しの変数に追加
6
6
 
7
7
 
8
8
 
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- しばしばデータの追がされていないことがある上に
13
+ データの追がされていないことがある上に
14
14
 
15
15
  エラーも発生しない
16
16
 
@@ -412,7 +412,197 @@
412
412
 
413
413
  ひとまず `ref`つかっての受け取りは諦めて
414
414
 
415
-  処理完了後にシリアル処理で戻り値を順に変数に格納しようと思っています。
415
+  処理完了後にシリアル処理で戻り値を順に変数に格納~~しようと思っています。~~しました。
416
+
417
+ ```powershell
418
+
419
+
420
+
421
+
422
+
423
+ function _New_MultiThread()
424
+
425
+ {
426
+
427
+ [OutputType([_MultiThread])]
428
+
429
+ $Thread = New-Object _MultiThread($host)
430
+
431
+ return $Thread
432
+
433
+ }
434
+
435
+
436
+
437
+
438
+
439
+ #検索対象データの読み込み
440
+
441
+ $_Sarch_List_Read = {
442
+
443
+
444
+
445
+ Param
446
+
447
+ (
448
+
449
+ # 読み込む二次元配列
450
+
451
+ [Parameter(Mandatory,
452
+
453
+ Position=0)]
454
+
455
+ $Ary,
456
+
457
+
458
+
459
+ # 読み込み開始位置
460
+
461
+ [Parameter(Mandatory,
462
+
463
+ Position=1)]
464
+
465
+ [int]
466
+
467
+ $Start,
468
+
469
+
470
+
471
+ # 読み込み終了位置
472
+
473
+ [Parameter(Mandatory,
474
+
475
+ Position=2)]
476
+
477
+ [int]
478
+
479
+ $End
480
+
481
+ )
482
+
483
+ for ($i = $Start; $i -le $End; $i++)
484
+
485
+ {
486
+
487
+ $CSV_Data = New-Object psobject | select -Property No,Category,Type,PutName,ListPrice,Purchase,PrimeCost,SellingPrice,Maker,DisplayOrderNo,EquipmentName,CharacterSymbol
488
+
489
+ $CSV_Data.No = $Ary[$i,1]
490
+
491
+ $CSV_Data.Category = $Ary[$i,2]
492
+
493
+ $CSV_Data.Type = $Ary[$i,3]
494
+
495
+ $CSV_Data.PutName = $Ary[$i,4]
496
+
497
+ $CSV_Data.ListPrice = $Ary[$i,5]
498
+
499
+ $CSV_Data.Purchase = $Ary[$i,6]
500
+
501
+ $CSV_Data.PrimeCost = $Ary[$i,7]
502
+
503
+ $CSV_Data.SellingPrice = $Ary[$i,8]
504
+
505
+ $CSV_Data.Maker = $Ary[$i,9]
506
+
507
+ $CSV_Data.DisplayOrderNo = $Ary[$i,10]
508
+
509
+ $CSV_Data.EquipmentName = $Ary[$i,11]
510
+
511
+ $CSV_Data.CharacterSymbol = $Ary[$i,12]
512
+
513
+
514
+
515
+ $CSV_Data
516
+
517
+
518
+
519
+ }
520
+
521
+ }
522
+
523
+
524
+
525
+ # 20000 x 12 の配列を作成 元がExcelから持ってきてるので 添え字は1から始まりと仮定する
526
+
527
+ $Ary = New-Object -TypeName 'System.Object[,]' -ArgumentList 20001,13
528
+
529
+ $i = 0
530
+
531
+
532
+
533
+ # 適当にデータ代入
534
+
535
+ foreach ($item in $Ary)
536
+
537
+ {
538
+
539
+ $_ = $i
540
+
541
+ $i++
542
+
543
+ }
544
+
545
+
546
+
547
+
548
+
549
+ $MultiThread = _New_MultiThread
550
+
551
+
552
+
553
+ Write-Host "検索テーブルを読み込んでいます..."
554
+
555
+ $Max = $Ary.GetUpperBound(0)
556
+
557
+ Write-host "対象データ行数 = $($Max)"
558
+
559
+ $Step = 2000
560
+
561
+ for ($i = 1; $i -le $Max; $i+=$Step)
562
+
563
+ {
564
+
565
+ if ($($i + $Step - 1) -le $Max)
566
+
567
+ {
568
+
569
+ $End = $($i + $Step - 1)
570
+
571
+ }
572
+
573
+ else
574
+
575
+ {
576
+
577
+ $End = $Max
578
+
579
+ }
580
+
581
+ $MultiThread.AddThread($_Sarch_List_Read,[ordered]@{
582
+
583
+ Ary = $Ary
584
+
585
+ Start = $i
586
+
587
+ End = $End
588
+
589
+ })
590
+
591
+ }
592
+
593
+
594
+
595
+ while (!($MultiThread.AllCompleted)){}
596
+
597
+ $Search = @($MultiThread.GetResult() | foreach {$_})
598
+
599
+ $MultiThread.Dispose()
600
+
601
+ Write-host "登録されたデータ数 = $($Search.Count)"
602
+
603
+
604
+
605
+ ```
416
606
 
417
607
 
418
608