1

私のC#プログラムでは、PanelにOnPaint()を1秒に1回呼び出して、現在の設定に基づいてグラフィック描画を実行させようとしています。メイン フォームは、System.Timers.Timer を使用して、Panel クラスの更新メソッドを呼び出します。更新メソッドは、Refresh() 呼び出しで終了します。しかし、実行すると、Refresh 行を参照する InvalidOperationExcetpion が常に表示され、「クロススレッド操作が無効です: コントロールが作成されたスレッド以外のスレッドからアクセスされました」と表示されます。また、この MSDN ページを参照してください: http://msdn.microsoft.com/en-us/library/ms171728.aspx

しかし、そのページのすべての例は、新しいスレッドを特定のフォームイベントに結び付けることを示唆しているようです. マウスクリックや同様のイベントではなく、タイマーに基づいて更新しています。別のスレッドで更新を実行するのは良いことのように思えますが、どうすればよいかわかりません (Java は得意ですが、C# 初心者です)。

4

1 に答える 1

8

メイン フォームは System.Timers.Timer を使用して、Panel クラスの update メソッドを呼び出します。

2 つのオプション:

Control.Invoke基本的に、別のスレッドから UI 要素にアクセスするべきではありません。またはを介し​​て適切なスレッドにマーシャリングできますが、UI の更新以外Control.BeginInvokeに重要な作業がない場合は、タイマーを強制することもできます。 UI スレッドでイベントを発生させます。

于 2012-07-27T14:30:27.877 に答える