>백엔드 개발 >C#.Net 튜토리얼 >WPF MaterialDesign 샘플 오픈 소스 프로젝트 소개

WPF MaterialDesign 샘플 오픈 소스 프로젝트 소개

零下一度
零下一度원래의
2017-06-23 15:01:434319검색

안녕하세요 여러분, 제가 다시 돌아왔습니다

이번에는 오픈 소스 프로젝트에서 작지만 유용한 모듈이나 구성 요소의 개발 아이디어에 대해 본격적으로 이야기를 시작했습니다.

동시에 소프트웨어가 신규 사용자 등록을 지원하는 버전 1.60으로 업데이트되었으며 더 이상 통합 테스트 계정을 사용할 수 없습니다.

다음 경로를 통해 다운로드할 수 있습니다.

1. GitHub에서 프로젝트를 팔로우하고 로컬로 다운로드하여 생성하면 최신 버전의 프로그램을 얻을 수 있습니다.

2. 로컬 버전이 베타 v0.5인 사용자는 프로그램의 오른쪽 상단에 있는 업데이트를 직접 클릭할 수 있습니다

3. 마지막으로 Microsoft 이외의 개발자에게는 다음과 같은 압축 패키지가 제공되며 압축 해제 후 바로 사용할 수 있습니다. .


아직도 어떤 소프트웨어인지 모르신다면 다음 블로그 게시물을 확인해 보세요:

[WPF MaterialDesign 샘플 오픈 소스 프로젝트] Work Time Manager

오늘은 클라이언트에 대해 이야기하겠습니다. 사이드 로그 구성 요소.

컴포넌트가 적합한지는 모르겠습니다. 어쨌든 소프트웨어의 일부이며 재사용이 가능한 작은 모듈입니다.

이번 로그 클래스는 매우 일반적인 구성 요소입니다.

1. 소프트웨어 어디에서나 사용됩니다.

3. 매우 높음

4. 빈번한 io 작업

처음 C#을 접했을 때 Log4net을 사용했습니다. 그러나 그 당시 떠오른 생각은 내 프로그램이 몇 미터에 불과할 수도 있다는 것이었습니다. 크기도 충분하고, 내 기본 프로그램과 비교하면 이는 분명히 부적절합니다.

그래서 2년 전 졸업하기 전에 저는 첫 번째 로그 구성 요소를 만들기 시작했습니다.

【.net】나만의 로그 구성 요소 만들기 - 개선된 버전

스레드, 차단, 리소스 경쟁 등을 포함한 기본 아이디어는 여전히 좋습니다.

갓 태어난 송아지는 호랑이를 무서워하지 않아서 아무 것도 모르고 막 시작했다는 말이 있죠.

스레드를 열어 로그 구성 요소의 첫 번째 버전을 작성했습니다.

그러나 결국 나는 어리고 문제는 여전히 명백합니다. 1초에 100개의 메시지를 입력하면 작동하지 않습니다.

그래서 C# 개발을 다시 시작하면서 리팩토링하는 데 시간이 좀 걸렸습니다.

우선 전체 아키텍처부터 시작해 보겠습니다.

- 기존 구성 요소의 기능:
* 멀티 스레드 대기열을 사용하고 뮤텍스 변수를 사용하여 텍스트 스레드 쓰기를 제어합니다.

* 싱글톤 잠금을 통해 리소스 경합을 제어합니다
* 잠금을 위해 스레드를 무작위로 선택하여 기록되는 로그 시간의 순서가 틀릴 수 있습니다
* 하나의 스레드가 하나의 텍스트 작업을 수행하며 스위치는 모두 단일 스레드 작업에서는 한 번에 하나의 변수만 씁니다
- 장점:
* 멀티 스레드 작업, 작업 효율성이 표면적으로 향상됨
* 고유성을 보장하기 위한 단일 케이스 잠금
- 단점:
, io의 과도한 작업은 심각한 성능 중복으로 이어집니다
* 한 번에 한 부분만 작성하세요
- 개선
* 생산자 소비자 모드 사용, 별도 작업, 스레드 수 제한
* 스택 대기열 사용, 먼저 입력 최초 출력, 로그 시퀀스 보장
* 단일 인스턴스 IO 변수, 일괄 쓰기 작업
변환 결과:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.