2012-08-15 3 views
1

내 응용 프로그램이 몇 가지 로그를 남길 수있는 별도의 스레드를 만들어야하며 작업을 사용하도록 제안되었습니다.작업에 작업 사용 - 작동 방법을 모르는 경우

나는이 일을 완전히 이해하지 못하기 때문에 나는이 권리가없는 것처럼 보인다. 내가 잘못 뭐하는 거지

public static void LogException(string message, Exception ex) 
{ 
    Action action= delegate() { logException(message, ex); }; 
    new Task(action); 
} 

public static void logException(string message, Exception ex) 
{ 
    var stackTrace = new StackTrace(); 
    var origin = stackTrace.GetFrame(1).GetMethod().Name; 
    var originclass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name; 
    var neworigin = string.Format("{0}.{1}", originclass, origin); 

    message += Environment.NewLine + Environment.NewLine + GetFullExceptionMessage(ex); 

    if (string.IsNullOrEmpty(message)) message = "No message given"; 

    //var exceptions = GetAllErrMessages(ex); 
    //message = exceptions.Aggregate(message, (current, exception) => current + Environment.NewLine + exception); 

    EventLogging.LogEvent(neworigin, message, EventLogEntryType.Error, 9999); 

    EmailMessage(neworigin, message, EventLogEntryType.Error); 
} 

: 여기

내가 가진 무엇인가? 나는 어떤 에러도 내지 않고 있지만 다시는 로그를 얻지 못한다.

감사합니다.

답변

5

new Task(action);은 새 작업을 생성하지만 실제로 실행되는 결과는 발생하지 않습니다. 이 경우

, 당신은 아마 사용할 수 있습니다

Task.Factory.StartNew(() => { /* code goes here */ }); 

그것은 당신의 코드가 다음 생성의 오버 헤드가 특히 짧은 경우/작업을 예약하는 것은 실제로 직접 실행하는 것보다 느려질 수 있습니다 언급 할 가치가 (이 물론 그 코드가 무엇인지에 달려 있습니다). 또한 이벤트가 다중 스레드 환경에 기록 될 때 오류 로깅이 제대로 작동하는지 확인하십시오. 그렇지 않은 경우, 귀찮게하지 않거나 명시 적 잠금을 추가 할 수 있습니다.

+0

좋아요! 효과가있었습니다. 또한, 오버 헤드에 대한 언급에서 이벤트 로깅 및/또는 이메일 오버 헤드가 오버 헤드가되지 않을까요? 내가 어떻게 알 겠어? 도와 주셔서 감사합니다! – ErocM

+0

@ErocM 글쎄, 모든 LogEvent 메서드를 그냥 목록에 문자열을 저장하거나 자체 백그라운드에서 로깅을 할 수있는 자신의 스레드를 만듭니다 알아요. 또한, 그냥 파일에 쓰는 경우, 버퍼링/캐싱/etc 덕택입니다. 항상 느린 것은 아닙니다. 실제로 알고 자한다면, 믿을만한'StopWatch'를 깨뜨리고 어느 것이 더 오래 걸릴지 (평균적으로 많은 수의 반복에 걸쳐) 실행하기를 원할 것입니다. – Servy

+0

그건 내가 한 짓이야. 도움을 다시 주셔서 감사합니다! – ErocM

1

new Task(action);Task.Factory.StartNew(action);으로 바꾸면 별도의 스레드에서 실행이 시작됩니다.

+0

도움에 감사드립니다! – ErocM

-1
은 다음과 같이 액션 정의를 다시 작성

:

myTask.Start() 

:

Task myTask = new Task(action); 

지금 당신이 작업을 시작할 수 있습니다

Action action = new Action(delegate { 
    logException(message, ex); 
}); 

다음 매개 변수로 작업과 새 작업을 만듭니다 Invoke 메서드를 호출하여 작업을 직접 실행할 수도 있습니다.

action.Invoke() 
+0

이 방법은 효율성이 떨어 지므로 Task.StartNew 메서드는 일반적으로 별도의 작업이 필요하지 않는 한 간단한 작업을 위해 만들어야합니다. 읽기 : https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/ – Milney

관련 문제