助けてほしいこと
こんにちは。
今、C#の基本をやっています。
Form1クラスでタイマーをセットしているのですが、timer.Stop()でエラーになります。
これはどのようにすればよいか教えてほしいのです。
詳細
タイマーをセットしているところ
C#
1//タイマー 2System.Timers.Timer timer; 3 4private void Setimer(int time) 5{ 6 // タイマーの生成 7 timer = new System.Timers.Timer(time); 8 timer.Elapsed += (sender, e) => 9 { 10 test_async(); 11 timer.Stop(); 12 label_Timer.Text = "タイマーとめたよ"; 13 }; 14 15 timer.Start(); 16 label_Timer.Text = "タイマーはじめました"; 17}
タイマー時間経過で呼び出している関数
C#
1private async Task test_async() 2{ 3 txtdata = textBox.Text; 4 if (txtdata == "その1") 5 { 6 while (Test.Proc1(txtdata) == false) 7 { 8 //停止になってたらとめる 9 if (Stopflg == true) break; 10 //再読み込みまで100ms空ける 11 await Task.Delay(100); 12 } 13 return; 14 } 15 16 // 非同期で動かす(固まっちゃうので) 17 await Task.Run(async () => 18 { 19 while((Test.Proc2(txtdata) == false) 20 { 21 //停止になってたらとめる 22 if (Stopflg == true) break; 23 //100ms待ってから 24 await Task.Delay(100); 25 } 26 }); 27 return; 28}
わからないこと
C#
1test_async();
がなければ、エラーになりませんので、ここが悪いとは思います。
C#
1await test_async();
にしてもだめでしたので、悩んでいます。
タイマーの呼び出しの中で非同期処理をしている関数を呼んではいけない、ということですか?
参考
参考にさせていただいたのはこちらの中ほどのコードでした。
https://webbibouroku.com/Blog/Article/cs-timer
エラー
例外がスローされました: 'System.InvalidOperationException' (System.Windows.Forms.dll の中) 型 'System.InvalidOperationException' の例外が System.Windows.Forms.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'label_Timer' がアクセスされました。
改めて
右も左もわからず、思うがまま組んでみてます。
そもそも、それじゃダメ、という意見もあるかと思います。
よろしければ、教えていただければうれしいです。
よろしくお願いいたします(- -)(_ _)ペコリ
回答3件
あなたの回答
tips
プレビュー