C #에서 while 루프를 이스케이프하는 방법
while 루프를 벗어나려고합니다. 기본적으로 "if"조건이 충족되면이 루프를 종료 할 수 있습니다.
private void CheckLog()
{
while (true)
{
Thread.Sleep(5000);
if (!System.IO.File.Exists("Command.bat"))
continue;
using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
if (s.Contains("mp4:production/CATCHUP/"))
{
RemoveEXELog();
Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();
<< Escape here - if the "if" condition is met, escape the loop here >>
}
}
}
}
}
break;
첫 번째 루프를 이스케이프하는 데 사용 합니다.
if (s.Contains("mp4:production/CATCHUP/"))
{
RemoveEXELog();
Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();
break;
}
두 번째 루프도 이스케이프하려면 플래그를 사용하고 out 루프의 가드를 확인해야 할 수 있습니다.
boolean breakFlag = false;
while (!breakFlag)
{
Thread.Sleep(5000);
if (!System.IO.File.Exists("Command.bat")) continue;
using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
if (s.Contains("mp4:production/CATCHUP/"))
{
RemoveEXELog();
Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();
breakFlag = true;
break;
}
}
}
그냥 중첩 루프 내에서 완전히 기능을 종료하려는 경우 또는,하는 넣어 return;
대신의 break;
.
그러나 이들은 실제로 모범 사례로 간주되지 않습니다. while
가드에 필요한 부울 논리를 추가하는 방법을 찾아야합니다 .
break
또는 goto
while ( true ) {
if ( conditional ) {
break;
}
if ( other conditional ) {
goto EndWhile;
}
}
EndWhile:
그러나 파일 시스템 이벤트를 수신하는 매우 다른 접근 방식 을 살펴보고 싶을 수도 있습니다 .
추가 로직 사용을 계속해야하는 경우 ...
break;
또는 반환 할 가치가있는 경우 ...
return my_value_to_be_returned;
그러나 코드를 보면 break 또는 return을 사용하지 않고 아래 수정 된 예제로 루프를 제어 할 수 있다고 믿습니다.
private void CheckLog()
{
bool continueLoop = true;
while (continueLoop)
{
Thread.Sleep(5000);
if (!System.IO.File.Exists("Command.bat")) continue;
using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
{
string s = "";
while (continueLoop && (s = sr.ReadLine()) != null)
{
if (s.Contains("mp4:production/CATCHUP/"))
{
RemoveEXELog();
Process p = new Process();
p.StartInfo.WorkingDirectory = "dump";
p.StartInfo.FileName = "test.exe";
p.StartInfo.Arguments = s;
p.Start();
continueLoop = false;
}
}
}
}
}
어떤 루프를 종료하려고합니까? 간단한 break;
것은 내부 루프를 종료합니다. 외부 루프의 경우 내부 루프를 중단하기 직전에 true로 설정된 외부 루프 범위 변수 (예 : boolean exit = false;)를 사용할 수 있습니다. 내부 루프 블록 후 exit 값을 확인하고 참이면 break;
다시 사용 하십시오.
"break"는 "가장 가까운"루프에서 벗어나는 명령입니다.
휴식을위한 좋은 용도는 많지만 꼭 필요하지 않은 경우에는 사용해서는 안됩니다. 고토를 사용하는 또 다른 방법으로 볼 수 있으며 이는 나쁘다고 간주됩니다.
예를 들면 다음과 같습니다.
while (!(the condition you're using to break))
{
//Your code here.
}
If the reason you're using "break" is because you don't want to continue execution of that iteration of the loop, you may want to use the "continue" keyword, which immediately jumps to the next iteration of the loop, whether it be while or for.
while (!condition) {
//Some code
if (condition) continue;
//More code that will be skipped over if the condition was true
}
Sorry for the necro-add, but there's something I really wanted to insert that's missing in the existing answers (for anyone like me stumbling onto this question via google): refactor your code. Not only will it make it easier to read/maintain, but it'll often remove these types of control-routing issues entirely.
Here's what I'd lean towards if I had to program the function above:
private const string CatchupLineToIndicateLogDump = "mp4:production/CATCHUP/";
private const string BatchFileLocation = "Command.bat";
private void CheckLog()
{
while (true)
{
Thread.Sleep(5000);
if (System.IO.File.Exists(BatchFileLocation))
{
if (doesFileContainStr(BatchFileLocation, CatchupLineToIndicateLogDump))
{
RemoveLogAndDump();
return;
}
}
}
}
private bool doesFileContainStr(string FileLoc, string StrToCheckFor)
{
// ... code for checking the existing of a string within a file
// (and returning back whether the string was found.)
}
private void RemoveLogAndDump()
{
// ... your code to call RemoveEXELog and kick off test.exe
}
ReferenceURL : https://stackoverflow.com/questions/6719630/how-to-escape-a-while-loop-in-c-sharp
'program tip' 카테고리의 다른 글
UNIX 줄 끝을 사용하도록 Visual Studio 구성 (0) | 2020.12.25 |
---|---|
mongodb를 임베디드 데이터베이스로 사용할 수 있습니까? (0) | 2020.12.25 |
Angular JS : REST / CRUD 백엔드 용 GET / POST / DELETE / PUT 클라이언트의 전체 예제? (0) | 2020.12.24 |
3 열에서 오른쪽으로 당기기, 왼쪽으로 당기기로 부트 스트랩 변경 div 순서 (0) | 2020.12.24 |
RabbitMQ가있는 셀러리 : AttributeError : 'DisabledBackend'개체에 '_get_task_meta_for'속성이 없습니다. (0) | 2020.12.24 |