色分けされたラベル コントロールを変更して、WinForm アプリが実行されているコンピューターの接続状態を表示するコードを少し書きました。
私のフォームには、次のコードがあります。
public frmShell()
{
InitializeComponent();
this.stateManager = new StateManager();
}
private void frmShell_Load(object sender, EventArgs e)
{
// Subscribe to events
this.stateManager.ConnectionChange += new StateManager.ConnectionChangeHandler(ConnectionHasChanged);
}
private void ConnectionHasChanged(object sender, ConnectionChangeEventArgs e)
{
if (e.ConnectionType == ConnectionType.Network)
{
if (e.ConnectionState == ConnectionState.Connected)
{
SetLabelOnline();
}
else
{
SetLabelOffline();
}
}
}
private void SetLabelOffline()
{
labelConnectivityValue.Text = "Offline";
labelConnectivityValue.ForeColor = Color.Red;
}
private void SetLabelOnline()
{
labelConnectivityValue.Text = "Online";
labelConnectivityValue.ForeColor = Color.Green;
}
ネットワーク アダプタを無効にしてコードをテストするたびに、SetLabelOnline()またはSetLabelOffline()メソッドで次のエラーが発生します。
クロススレッド操作が無効です: コントロール 'labelConnectivityValue' は、それが作成されたスレッド以外のスレッドからアクセスされました。
1. コードが無効なクロススレッド操作と見なされる理由がわかりません。さらに、以前に別の WinForm アプリで使用したコードをまったく同じ方法で再利用しているだけです。
2. この問題を解決する方法がわかりません。特に、私が達成しようとしていることは非常に基本的なことのように思えます。
注: statemanager のコードは、接続の状態を頻繁にチェックし、接続プロパティを変更する必要がある場合、つまり接続状態が変更された場合にイベントを発生させる単純なタイマーです。