나는 간단한 Windows 서비스를 하루에 한 번만 실행합니다. 그것은 데이터베이스에서 몇 가지 쿼리를 수행하고 적절한 html 컨텐트 (테이블, divs ...)를 생성하고 여러 수신자에게 전자 메일 본문으로 보냅니다.멀티 스레딩을 사용하여이 코드를 향상시킬 수 있습니까?
전자 메일의 본문은 다음과 같이 작성됩니다
private static string GenerateBody()
{
using (var stringWriter = new StringWriter())
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
htmlWriter.RenderBeginTag("html");
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Head);
htmlWriter.WriteLine("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
htmlWriter.RenderEndTag();
htmlWriter.RenderBeginTag("body");
htmlWriter.Write(
new StringBuilder()
.Append(OverviewParagraph.GenerateHTMLContent())
.Append(PackageWeightParagraph.GenerateHTMLContent())
.Append(BoxWeightParagraph.GenerateHTMLContent())
.Append(CodeQualityParagraph.GenerateHTMLContent())
.Append(ChecksParagraph.GenerateHTMLContent())
.ToString()
);
htmlWriter.RenderEndTag();
htmlWriter.RenderEndTag();
return stringWriter.ToString();
}
}
모든 GenerateHTMLContent
방법은 거의 동일합니다 - 그들이의 도움으로 HTML 테이블을 구축, 내 데이터베이스에 쿼리를 실행 HTMLTextWriter를 호출하고 테이블을 문자열로 반환합니다.
멀티 스레딩 또는 비동기 대기 패턴을 사용하여이 코드를 향상시킬 수 있습니까? 문제의 코드는 StringBuilder 객체에 행을 추가하는 곳입니다.
편집 : 이전에 멀티 스레딩을 사용 해본 적이 없기 때문에 질문을했습니다. 가능한지 알고 싶었습니다. 게다가, 프로그램은 이제 충분히 빠르게 실행됩니다.
루프에서이 메서드를 호출하는 코드가 있습니까? 즉, 나는 당신이 수신자리스트를 순환하고 이메일을 생성하기 위해 위의 코드를 호출하고 있다고 생각하고있다. 맞습니까? –
리팩토링의 첫 번째 단계는 2 개 이상의 Using()를 사용하는 것일 수 있습니다. 다른 질문은 GenerateHTMLContent의 메소드가 시간 소모적 인 작업이라는 것을 알고 있습니까? 먼저 그들이 정말로 쇼 스트 스토퍼인지 아는 몇 가지 벤치마킹을 했습니까? – Zenwalker
매우 드뭅니다. 스레드는 사용자 인터페이스 (async/await)가 멈추거나 멀티 코어 CPU에서 더 많은 CPU 사이클을 사는데 도움이됩니다. 하루 한 번 프로그램이 사용자 인터페이스를 가질 가능성은 거의 없습니다. 그리고이 코드는 cpu주기가 아닌 더 많은 dbase 서버와 네트워크 대역폭을 필요로합니다. –