C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■102820 / 5階層)  非同期処理
□投稿者/ とっちゃん (807回)-(2024/01/07(Sun) 23:49:58)
No102819 (まさ さん) に返信
> ■No102815 (furu さん) に返信
>>■No102813 (まさ さん) に返信
> >> form1で1秒毎にデータを読込み折れ線グラフを表示させている時
> >>form3を走らせるとform1の折れ線グラフが止まってしまします
>>form3を走らせるところがありませんが
>>どう走らせていますか?
>>
>>form1を表示中form3を走らせるのに
>>なぜform3でform1を作成(new Form1())しているのですか?
>
>
> 説明不足ですみません
> form1からボタンでform2(メニュー画面)を表示させてグラフ表示のform3を選択しています
> form3はグラフを作るためにデータを900万件読み込んでいます
> そのデータを読み込んでいる為20秒前後かかってしまい、その間form1の棒グラフが動かなく
> なってしまいました
>
> form3はform2から下記で開いています
> private void btnForm3_Click(object sender, EventArgs e)
> {
> Form3 form3 = new Form3();
> form3.Show();
> this.Close();
> }
>
form3 のコンストラクタに form1 のインスタンスを渡すのでは?
まぁ、その部分はひとまず置いておくとして…


> form3はグラフを作るためにデータを900万件読み込んでいます
> そのデータを読み込んでいる為20秒前後かかってしまい、その間form1の棒グラフが動かなく
> なってしまいました

このデータを読み込んでいる間、UIスレッドがビジー状態になっています(何かしらのイベントハンドラが終了していない状態)。
System.Windows.Forms.Timer は、ウィンドウメッセージとして通知されます(マウスやキーボードなどの処理と同様)。
そのため、様々なイベントはできるだけ速やかに処理されなければなりません。

そのため、何らかのメソッドで時間がかかっているとメッセージが処理されず、タイマー通知が来なくなり
結果として、1秒ごとに処理されているはずなのに通知が来ないという状況になります。

すでに記載していますが、結論的な部分から言えば以下の3か所を非同期化する形にするのが取りこぼしなどは
少なくなるとおもいます(現行コードだと3の部分を非同期化した時点で、form1のCSV保存などでエラーメッセージが出ると思います)。


1. form1 でOpcServerから読み取る処理は、System.Threading.Timer などの非同期型を使う
2. CSVへの保存はファイルが開けない場合はリトライ処理を盛り込む(メッセージを出して止めてしまうのはNG)
3. form3 でCSVから読み取る部分も非同期化する

1, 2 についてはすでにざっくりとした形ですが、すでに記載してるので、3についても記載しておきます。

こちらは、day7() を非同期にすればよいと思います。

簡易的な非同期化であれば、以下のようにするだけでよいと思います。

await Task.Factory.StartNew( () => day7() );



ただし、Load() イベントの後半部分(line7()以降の部分)はday7() の処理が終わってから動くため
グラフが作られていない状態になります。

動かしてみないと画面が出てきてしまうかどうかわかりませんが、もし出てきてしまう場合は
グラフが出ていない状態が不具合ではなく、読み取り中だとわかるようにしておく必要があるかもしれません。

まぁ出てこなくても20秒も何も出てこない状態が続いていると(しかもグラフは動いている)
押し損ねた?と思われるので、どちらにしても工夫は必要になると思います。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[4]: 非同期処理 /まさ →Re[6]: 非同期処理 /takahiro
 
上記関連ツリー

非同期処理 / まさ (24/01/06(Sat) 09:59) #102807
Re[1]: 非同期処理 / WebSurfer (24/01/06(Sat) 10:52) #102808
Re[1]: 非同期処理 / とっちゃん (24/01/06(Sat) 15:37) #102812
  └ Re[2]: 非同期処理 / まさ (24/01/06(Sat) 17:58) #102813
    ├ Re[3]: 非同期処理 / まさ (24/01/06(Sat) 17:59) #102814
    │└ Re[4]: 非同期処理 / とっちゃん (24/01/06(Sat) 22:26) #102816
    └ Re[3]: 非同期処理 / furu (24/01/06(Sat) 20:29) #102815
      └ Re[4]: 非同期処理 / まさ (24/01/07(Sun) 20:28) #102819
        └ 非同期処理 / とっちゃん (24/01/07(Sun) 23:49) #102820 ←Now
          └ Re[6]: 非同期処理 / takahiro (24/01/15(Mon) 22:01) #102848
            ├ Re[7]: 非同期処理 / WebSurfer (24/01/15(Mon) 22:11) #102849
            │└ Re[8]: 非同期処理 / takahiro (24/01/15(Mon) 22:21) #102850
            │  └ Re[9]: 非同期処理 / WebSurfer (24/01/15(Mon) 22:24) #102851
            │    └ Re[10]: 非同期処理 / takahiro (24/01/15(Mon) 22:33) #102852
            ├ Re[7]: 非同期処理 / とっちゃん (24/01/16(Tue) 11:33) #102853
            └ Re[7]: 非同期処理 / kiku (24/01/17(Wed) 11:03) #102861

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信