私は自分のアプリケーション用のシリアルポート接続ハンドラを書いているので、ユーザはポート自体に接続したり接続解除する必要はありません。下に、ロジックと、接続をどのように維持する予定かを確認できます。シリアルポート接続ハンドラ
私の問題は、whileループによるCPU使用量の急増です。アプリケーションの他の部分に影響を与えることなく、このようなループをどのように遅くするのですか?
Thread.Sleep()
は明白なオプションです。しかし、アプリケーションの他の部分はスレッドによって処理され、Task.Run()
で接続ハンドラを起動するとThread.Sleep()
の影響を受けますか?その場合は、別のスレッドでハンドラを開始することもできます。しかし、ハンドラが(SerialPortオブジェクトのような)オブジェクトを操作しているときに別のスレッドから起動すると、問題が発生する可能性がありますか?
private void StartConnectionHandler() {
Task.Run(() => ConnectionHandler());
}
private enum ConnectionState {
AwaitPortSelected,
IsPortValid,
OpenPort,
AwaitLinkStateChange,
ClosePort
}
private void ConnectionHandler() {
var connectionState = ConnectionState.AwaitPortSelected;
while (!SerialPortCts.IsCancellationRequested) {
switch (connectionState) {
case ConnectionState.AwaitPortSelected:
break;
case ConnectionState.IsPortValid:
break;
case ConnectionState.OpenPort:
break;
case ConnectionState.AwaitLinkStateChange:
break;
case ConnectionState.ClosePort:
break;
}
}
}
ポートへの接続を自動的に処理する必要がある場合(たとえば、ユーザーが使用する別のポートを選択した場合など)、必要があります(Timerを@pitersmxとしてお勧めします)。さらに、受信したデータを処理するためのイベントハンドラがあります。 – Oystein