ノートPCで、時々Invokeで例外が発生します。
C#でメイン処理スレッドで処理し、必要に応じてGUIの変更を行うという構成のソフトを開発しています。
スレッドからGUIを変更する為、Task.Run()とInvoke()を使用し、以下の様な感じで使用しています。
Task.Run(() => { Invoke((MethodInvoker)(() => { // テキストボックスなどコントロールへのアクセス } )); });
開発環境は、Visual Studio Express 2017 for Windows Desktop です。
アプリを起動した直後、Invoke()が見つかりません、という内容の例外が発生してしまいます。
状況は以下の通りです。
- 起動直後だけで、その後は発生しない。
- デスクトップPCでは発生しない。
- 複数台のノートPCで起動させましたが、発生するPCとしないPCがありました。
- 感覚的には、ノートPCが省電力モードに入っていて、起動に時間がかかり、Invoke関連のファイルが読み込まれないうちにInvokeを読んでいる感じです。
アプリ起動時に、関連するライブラリー、DLL等のロードが終わったことを確認し、処理を開始すれば回避出来ると考えています。
C#で関連ファイルのロードが終わるまで、ウエイトする方法は無いでしょうか?
もしくは、全然、別の要因でしょうか?
よろしくお願いします。
こちらで再現可能な最小のコードを新規作成して掲載してください。
起動直後に、テキストボックスに初期値を表示しています。
起動時に例外が発生して更新されないのですが、その後、MainLoopスレッドで同じ関数を呼び出すと、ちゃんと更新されます。
```
public Form1()
{
InitializeComponent();
UpdateDataBasePath(@"Test")
.........................
// Main Task 起動
Task.Run(() => {
this.MainLoop();
});
Console.WriteLine("Main Init OK !");
}
private void UpdateDataBasePath(string mes)
{
Task.Run(() =>
{
Invoke((MethodInvoker)(() =>
{
txtBoxDataBasePath.Text = mes;
}
));
});
}
```
よろしくお願いします。
「.....」と MainLoop でエラーになります。
「こちらで再現可能な」
「最小のコードを」
「新規作成して」
掲載してください。
もちろん、新規作成した後は、
「再現することを確認してから」
掲載してください。
質問文の編集で、問題の発生したコードと、実際のエラー内容の記載をお願いします。
回答1件
あなたの回答
tips
プレビュー