Programing/C#

do while의 활용 법 featuring ReadAsStreamAsync(비동기 스트림)

Ezzi 2020. 2. 18. 21:47
반응형

 

개인적으로 do while도 사용 빈도가 낮은 문법 중에 하나인데요.

 

다른 분들은 자주 사용하시는지 모르겠네요.

 

 

일단 기본적인 사용 방법먼저 설명해 보겠습니다. 

do
   statement
while ( expression ) ;

msdn 에는 이렇게 정의 되어 있네요.

 

"expression(조건식이) 0(거짓)이 될때까지 statement(문)을 계속 실행 된다."

 

 

while과 다른점은 조건식과 관계없이 무조건 1번은 실행 된다는 점 입니다. 

static void Main(string[] args)
{
	Console.WriteLine("start");
	int i = 0;
	do
	{
		i++;
		Console.WriteLine($"{i}");
	}while(i < 10);
	Console.WriteLine("end");
}

i 를 하나씩 증가 시키다가 

i 가 10이상이 되면 빠져나오는 구조 입니다. 

 

결과가 이렇게 나오게 됩니다. 

조건식을 i > 10으로 변경하면 어떻게 될까요

 

while( i > 10) 으로 변경하고 실행해 보았습니다. 

 

무조건 한번은 실행되고 조건식이 거짓이기 때문에 바로 끝나게 됩니다. 

 

 

사용 법은 이제 알았으니 어떤식으로 활용할 수 있을지 살펴 볼까요.

 

바로 코드를 보겠습니다. 

public static async void ReadAsync(HttpResponseMessage msg)
{
	using (var stream = await msg.Content.ReadAsStreamAsync()) 
	{
		int totalRead = 0;
		var buffer = new byte[1024];
		bool isMoreRead = true;

		do 
		{
			var read = await stream.ReadAsync(buffer, 0, buffer.Length);
			if (read == 0)
			{
				isMoreRead = false;
			}                        
			else
			{
				var data = new byte[read];
				buffer.ToList().CopyTo(0, data, 0, read);
				totalRead += read;
			}
		}while(isMoreRead);
	}
}

do while을 비동기 스트림에서 함께 사용하는 방법을 보겠습니다. 

 

boolean 타입 isMoreRead 가 조건식으로 되어 있습니다.

 

false로 변하면 빠져 나오는 구조 입니다. 

 

반복문은 stream에서 읽을 buffer가 남아 있는지 계속 체크 하고 있네요.

 

벌써 눈치 채신 분들도 있겠지만...

 

progressbar의 value로 활용을 할수가 있겠습니다. 

 

꼭 이렇게 코드를 짜야 한다는 법은 아니지만 이렇게 활용할 수도 있다는 정도만 아시면 될 것 같습니다. 

 

 

 

github 링크

 

https://github.com/Helloezzi/howtouse_dowhile

 

Helloezzi/howtouse_dowhile

Contribute to Helloezzi/howtouse_dowhile development by creating an account on GitHub.

github.com

 

 

 

반응형