2016-11-04 2 views
1

현재 SQL Server 테이블에 C# 응용 프로그램에 대한 로깅을 개발하고 있습니다.비동기 화재 및 잊어 C#

나는 Logger이라는 정적 클래스가 지정되어 있으며, 정적 메서드 writeToLog()이 있습니다.

그냥 정적 함수를 호출 스레드를 차단하지 않고 호출하려고합니다.

어떻게 C#에서이 기능을 빠르고 깨끗하게 처리 할 수 ​​있습니까?

함수는 단지 불이나 잊어 버린 것을 반환하지 않습니다. 조언

+1

Task.Run (writeToLog); – Steve

+5

바퀴를 다시 발명하지 마십시오. 거기에서 실행하려고하는 모든 문제를 해결 한 수많은 무료 로깅 라이브러리가 있습니다. 예를 들어 Log4Net은 [Sql 서버에 로그 대상으로 직접 쓸 수 있습니다] (https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Appender.AdoNetAppender.html). –

+5

로깅은 백그라운드 작업자 스레드에서 처리하지 않는 한'실행되지 않고 잊어 버려서는 안됩니다. ' 당신이 '불을 피우고 잊어 버리면, 그것은 질서를 바꿀 수도 있고, 당신은 그것을 원치 않을 것입니다. –

답변

0

에 대한

덕분에 serveral 가능한 로깅 라이브러리가 거기에 성능에 대한 몇 가지 생각을 보냈습니다있는 가능성이있다.

가벼운 무게 솔루션을 직접 개발해야하는 경우 두 가지 방법이 있습니다.

1) 로그-방법은 백그라운드 스레드로 SQL 데이터베이스에 기록 된 큐의 로그인 정보를 저장

2

)을 기다리고 않고, 로깅 기능을 실행하는 Task 만들기 .

로깅 자체가 작업 생성 오버 헤드없이 동기 함수 호출로 수행 될 수 있으므로 두 번째 방법을 권합니다.

이 접근법의 또 다른 인수는 로그 메시지의 순서를 결정할 수 있다는 것입니다. 각 단일 메시지에 대해 작업을 사용하면 실행 순서가 정의되지 않습니다.

그리고 마지막 인수 : 메시지 블록을 SQL 테이블에 작성하는 것이 더 효과적 일 수 있습니다. 대기열을 사용하면 대량 작업으로 메시지를 쓸 수 있습니다.

+0

응용 프로그램에 항상 로깅을위한 전용 스레드를 사용하도록 설정하면 일부 '작업'개체를 만들고 스레드 풀을 활용하는 오버 헤드보다 * 더 높은 오버 헤드가 발생할 가능성이 큽니다. 새로운'Task'를 만드는 것은 근본적으로 아무런 비용이 들지 않습니다. 수천 개의 인스턴스를 곱하고, 새로운 Thread를 시작하고, 애플리케이션의 전체 수명 동안 활성 상태를 유지하도록 강요하더라도, 다소 비쌉니다. – Servy

+0

@Servy - 힌트를 보내 주셔서 감사합니다. 추가 인수가 추가되었습니다. –

+0

@Servy 나는 그것에 동의하지 않는다.로깅을 처리하는 단일 스레드가 동시에 실행되는 여러 작업보다 훨씬 효율적이라고 생각합니다. 또한 여러 로깅 동작을 일괄 처리 할 수 ​​있습니다. 로그를 유지하면서 오류가 동 기적으로 처리 될 수 있습니다. –

관련 문제