現在仕事で作成しているコードで、メイン画面から呼び出されるプラグインの処理を作成しています。
プラグインの処理には時間がかかるものが含まれるため、並列処理を使用しています。
この並列処理の中で、進捗バーを表示、更新するサブウィンドウを表示させようとしています。
以下のようなコードを作成したのですが、表示されるサブウィンドウが固まったまま、ボタンも押せないという状況です。
・メイン画面の処理
C#
1using System; 2using System.Threading.Tasks; 3using System.Windows.Forms; 4 5namespace UIThreadTest 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 /// <summary> 15 /// 並列処理開始ボタン押下 16 /// </summary> 17 /// <param name="sender"></param> 18 /// <param name="e"></param> 19 private async void btnStart_Click(object sender, EventArgs e) 20 { 21 TestClass test = new TestClass(); 22 23 Task testTask = new Task(()=> 24 { 25 test.TestStart(); 26 } 27 ); 28 29 testTask.Start(); 30 31 await testTask; 32 33 MessageBox.Show("処理完了。"); 34 } 35 } 36} 37
プラグインの処理
C#
1using System.Threading; 2 3namespace UIThreadTest 4{ 5 class TestClass 6 { 7 8 public void TestStart() 9 { 10 // サブウィンドウを作成 11 Subwindow subwin = new Subwindow(); 12 // 進捗バーを設定(最小値0, 最大値100) 13 subwin.Setup(0, 100, 1); 14 15 for (int i = 0; i < 100; i++) 16 { 17 // サブウィンドウ表示 18 subwin.Show(); 19 subwin.TopMost = true; 20 subwin.TopMost = false; 21 22 // 時間のかかる処理 23 Thread.Sleep(5000); 24 25 26 subwin.Update(i); 27 } 28 } 29 30 } 31}
サブウィンドウ内の処理
C#
1using System.Windows.Forms; 2 3namespace UIThreadTest 4{ 5 public partial class Subwindow : Form 6 { 7 public Subwindow() 8 { 9 InitializeComponent(); 10 } 11 12 /// <summary> 13 /// 進捗バーの初期設定 14 /// </summary> 15 /// <param name="min">最小値</param> 16 /// <param name="max">最大値</param> 17 /// <param name="step">ステップ</param> 18 public void Setup(int min, int max, int step) 19 { 20 this.progressBar1.Minimum = min; 21 this.progressBar1.Maximum = max; 22 this.progressBar1.Step = step; 23 this.progressBar1.Value = 0; 24 } 25 26 /// <summary> 27 /// 進捗バーの更新 28 /// </summary> 29 /// <param name="value">更新値</param> 30 public void Update(int value) 31 { 32 this.progressBar1.Value = value; 33 } 34 } 35} 36
原因としては、サブウィンドウの処理がUIスレッド内で行われていないからだと思います。
メイン画面の処理でサブウィンドウの表示、更新処理等を入れたいところですが、そうすると進捗バーの更新ができず、困っています。
もし、サブウィンドウを並列処理内で呼び出して表示、更新ができる方法が分かる方がおられましたら、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー