안녕하세요 여러분, 제가 다시 돌아왔습니다
이번에는 오픈 소스 프로젝트에서 작지만 유용한 모듈이나 구성 요소의 개발 아이디어에 대해 본격적으로 이야기를 시작했습니다.
동시에 소프트웨어가 신규 사용자 등록을 지원하는 버전 1.60으로 업데이트되었으며 더 이상 통합 테스트 계정을 사용할 수 없습니다.
다음 경로를 통해 다운로드할 수 있습니다.
1. GitHub에서 프로젝트를 팔로우하고 로컬로 다운로드하여 생성하면 최신 버전의 프로그램을 얻을 수 있습니다.
2. 로컬 버전이 베타 v0.5인 사용자는 프로그램의 오른쪽 상단에 있는 업데이트를 직접 클릭할 수 있습니다
3. 마지막으로 Microsoft 이외의 개발자에게는 다음과 같은 압축 패키지가 제공되며 압축 해제 후 바로 사용할 수 있습니다. .
아직도 어떤 소프트웨어인지 모르신다면 다음 블로그 게시물을 확인해 보세요:
오늘은 클라이언트에 대해 이야기하겠습니다. 사이드 로그 구성 요소.
컴포넌트가 적합한지는 모르겠습니다. 어쨌든 소프트웨어의 일부이며 재사용이 가능한 작은 모듈입니다.
이번 로그 클래스는 매우 일반적인 구성 요소입니다.
1. 소프트웨어 어디에서나 사용됩니다.
3. 매우 높음
4. 빈번한 io 작업
처음 C#을 접했을 때 Log4net을 사용했습니다. 그러나 그 당시 떠오른 생각은 내 프로그램이 몇 미터에 불과할 수도 있다는 것이었습니다. 크기도 충분하고, 내 기본 프로그램과 비교하면 이는 분명히 부적절합니다.
그래서 2년 전 졸업하기 전에 저는 첫 번째 로그 구성 요소를 만들기 시작했습니다.
【.net】나만의 로그 구성 요소 만들기 - 개선된 버전
갓 태어난 송아지는 호랑이를 무서워하지 않아서 아무 것도 모르고 막 시작했다는 말이 있죠.
스레드를 열어 로그 구성 요소의 첫 번째 버전을 작성했습니다.
그러나 결국 나는 어리고 문제는 여전히 명백합니다. 1초에 100개의 메시지를 입력하면 작동하지 않습니다.
그래서 C# 개발을 다시 시작하면서 리팩토링하는 데 시간이 좀 걸렸습니다.
우선 전체 아키텍처부터 시작해 보겠습니다.
using System;using System.Collections;using System.IO;using System.Text;using System.Threading;using System.Windows.Threading;namespace Helper {public static class LogHelper {private static readonly Queue LogQueue = new Queue();private static bool _isStreamClose = true;private static bool _isThreadBegin = false;private static StreamWriter _fileStreamWriter;private static readonly string fileName =@"BugLog.txt";static int _intervalTime = 10000;// 10sstatic System.Timers.Timer _timer = new System.Timers.Timer(_intervalTime);/// <summary>/// 添加日志队列/// </summary>/// <param name="message"></param>public static void AddLog(string message) {string logContent = $"[{DateTime.Now:yyyy-MM-dd hh:mm:ss}] =>{message}"; LogQueue.Enqueue(logContent);if (!_isThreadBegin) { BeginThread(); } }public static void AddLog(Exception ex) {var logContent = $"[{DateTime.Now:yyyy-MM-dd hh:mm:ss}]错误发生在:{ex.Source},\r\n 内容:{ex.Message}"; logContent += $"\r\n 跟踪:{ex.StackTrace}"; LogQueue.Enqueue(logContent);if (!_isThreadBegin) { BeginThread(); } }/// <summary>/// 读取日志队列的一条数据/// </summary>/// <returns></returns>private static object GetLog() {return LogQueue.Dequeue(); }/// <summary>/// 开启定时查询线程/// </summary>public static void BeginThread() { _isThreadBegin = true;//实例化Timer类,设置间隔时间为10000毫秒; _timer.Interval = _intervalTime; _timer.Elapsed += SetLog;//到达时间的时候执行事件; _timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true); _timer.Enabled = true; }/// <summary>/// 写入日志/// </summary>private static void SetLog(object source, System.Timers.ElapsedEventArgs e) {if (LogQueue.Count == 0) {if (_isStreamClose) return; _fileStreamWriter.Flush(); _fileStreamWriter.Close(); _isStreamClose = true;return; }if (_isStreamClose) { Isexist();string errLogFilePath = Environment.CurrentDirectory + @"\Log\" + fileName.Trim();if (!File.Exists(errLogFilePath)) { FileStream fs1 = new FileStream(errLogFilePath, FileMode.Create, FileAccess.Write); _fileStreamWriter = new StreamWriter(fs1); }else{ _fileStreamWriter = new StreamWriter(errLogFilePath, true); } _isStreamClose = false; }var strLog = new StringBuilder();var onceTime = 50;var lineNum = LogQueue.Count > onceTime ? onceTime : LogQueue.Count;for (var i = 0; i < lineNum; i++) { strLog.AppendLine(GetLog().ToString()); } _fileStreamWriter.WriteLine(strLog.ToString()); }/// <summary>/// 判断是否存在日志文件/// </summary>private static void Isexist() {string path = Environment.CurrentDirectory + @"\Log\";if (!File.Exists(path)) { Directory.CreateDirectory(path); } } } }
지금은 로그 파일 사용, 임시 소프트웨어 종료, 대기열 트리거 시간 및 일괄 쓰기 횟수와 같은 고려 사항과 같은 일부 특수 상황을 다루지 않았습니다.
물론, 나중에 개선할 방법을 알고 싶다면 해당 프로젝트의 GitHub를 팔로우하면 됩니다.
물론, 좋은 아이디어가 있지만 직접 작성하고 싶지 않다면 제가 도와드리겠습니다!
위 내용은 WPF MaterialDesign 샘플 오픈 소스 프로젝트 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!