さて、状況は次のとおりです。
ConnectionStateとConnectionSollStateの2つの設定を持つ1つのクライアントがあり、どちらも同じ列挙可能(TypeConnectionState)であり、クライアント接続の実際の状態と接続の状態を格納します。toのすべての組み合わせで、ConnectionStateが「Connected」であるがConnectionSollStateが「Closed」である場合など、何か異なることが発生するはずです->クライアントをティアダウンします。だから私は私がチェックしなければならない4つの可能性が好きです。これで、すべてのクライアントが無限の数のセッションを処理でき、すべてのセッションに状態(StreamStateおよびStreamSollState)もあり、これらの状態には列挙可能な6つのオプションがあります。
これから、私は20のスイッチ条件を作成していますが、コードは非常に乱雑に見えます。コーディング中は5分ごとに何か間違ったことをしています。このような状況を処理する簡単な方法はありますか?(if / else)事態を悪化させるでしょう。
例:
private void RTSPWorker() {
try {
byte[] buffer = new byte[2048];
while (!mb_RTSPWorkerAbbort) {
// Call TransportWD
Thread.Sleep(100 * mi_ConnectionTimeOut);
// Check ConnectionSollState
switch(ConnectionSollState) {
case TypeConnectionState.Connected:
// ConnectionSollState = Connected, check ConnectionState
switch(ConnectionState) {
case TypeConnectionState.Connected:
// ConnectionState is connected, keep-alive!
if(GET_PARAMETER() == null) {
DESCRIBE();
}
// Check streams too
foreach (cRTSPStream oStream in mo_StreamDict.Values) {
// Check StreamSollState
switch(oStream.RTSPStreamSollState) {
case cRTSPStream.TypeRTSPStreamState.Play:
// SollState is PLAY, check State
switch(oStream.RTSPStreamState) {
case cRTSPStream.TypeRTSPStreamState.Play:
//Stream is alive, keep-alive!
if (oStream.PLAY() == null) { oStream.DESCRIBE(); } break;
case cRTSPStream.TypeRTSPStreamState.Closed:
// Reinitialise.
if (oStream.SETUP() != null) { oStream.PLAY(); } break;
default:
// Default, send play.
oStream.PLAY(); break;
}
break;
case cRTSPStream.TypeRTSPStreamState.Pause:
// SollState is on pause, check State
switch(oStream.RTSPStreamState) {
case cRTSPStream.TypeRTSPStreamState.Closed:
// Reinitialise.
if (oStream.SETUP() != null) { oStream.PLAY(); } break;
default:
oStream.PAUSE();
break;
}
break;
case cRTSPStream.TypeRTSPStreamState.Closed:
// SollState is closed, check State
switch(oStream.RTSPStreamState) {
case cRTSPStream.TypeRTSPStreamState.Closed:
// Is closed, do nothing
break;
default:
// Default teardown, remove session
oStream.TEARDOWN();
this.RemoveRTSPSession(oStream);
break;
}
default:
// Default, what do?
break;
}
}
break;
case TypeConnectionState.Closed:
// ConnectionState should be connected, re-connect!
while(Connect() != true) {
// Sleep for 200ms, try again
Thread.Sleep(200);
}
break;
default:
// TODO anything else
break;
}
break;
case TypeConnectionState.Closed:
// Check ConnectionState
switch(ConnectionState) {
case TypeConnectionState.Connected:
// Is connected, should be closed. Close connection & clean up!
Close(null);
break;
default:
// Anything other than Connected, do nothing.
break;
}
break;
default:
break;
}
}
} catch {
}
}