프로그래밍/.Net

FileStream 비동기 file writer

강태공97 2014. 1. 17. 21:23

File Stream으로 비동기 Writer를 해보면,

비동기 방식이 좋긴한데.. Write되는 문자열의 신뢰성이 부족하다.

 

예를들어 100번 loop를 돌면서 Log를 써야되는 경우가 발생한다면.

private void Begin_Writer(object sender, EventArgs e) // 비동기 Writer 할경우 time 측정
{
long start = DateTime.Now.Ticks;

for (int i = 0; i < 100; i++)
{
string sz = string.Format("BeginWrite : [2012-08-29 10:10:01.685] [2012-08-29 10:10:01.685][2012-08-29 10:10:01.685]{0} \r\n", i);
byte[] test = Encoding.UTF8.GetBytes(sz);
_write.BeginWrite(test, 0, sz.Length, wcallback, null);
Thread.Sleep(2); // 안정적 Writing에 필요한 time
}

long end = DateTime.Now.Ticks;

MessageBox.Show(string.Format("BeginWrite time : {0}", (double)(end - start) / 10000000.0F));

}

==> Time -> 0.1~ 0.2 정도

 

// WriterLine 함수를 사용한 예 ,, 별도의 Wait이 필요치 않다. Write자체가 동기적 수행됨.

private void StreamWriter의 WriterLine(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter(_write);
sw.AutoFlush = true;

long start = DateTime.Now.Ticks;
for (int i = 0; i < 100; i++)
{
string sz = string.Format("WriteLine : [2012-08-29 10:10:01.685] [2012-08-29 10:10:01.685][2012-08-29 10:10:01.685]{0}", i);
sw.WriteLine(sz);
}

long end = DateTime.Now.Ticks;
MessageBox.Show(string.Format("WriteLine time : {0}", (double)(end - start) / 10000000.0F));
}

==> Time -> 0.001 ~ 0

 

// Threading 처리하여, Log 문자열을 Queue에 넣고, 다른 Thread에서 Queue가 있을경우 File Writing하는 방식.. -> 안정적 사용 --> 요것으로 선택.

private void button8_Click(object sender, EventArgs e)
{
swth.AutoFlush = true;
long start = DateTime.Now.Ticks;
for (int i = 0; i < 100; i++)
{
string sz = string.Format("WriteLine : [2012-08-29 10:10:01.685] [2012-08-29 10:10:01.685][2012-08-29 10:10:01.685]{0}", i);
ReqLog(sz);
}

long end = DateTime.Now.Ticks;
MessageBox.Show(string.Format("Thread time : {0}", (double)(end - start) / 10000000.0F));
}

==> Time -> 0.001 ~ 0