Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in das Open-Source-Beispielprojekt WPF MaterialDesign

Einführung in das Open-Source-Beispielprojekt WPF MaterialDesign

零下一度
零下一度Original
2017-06-23 15:01:434262Durchsuche

Hallo zusammen, ich bin wieder zurück

Dieses Mal haben wir wirklich angefangen, über die Entwicklungsideen kleiner, aber nützlicher Module oder Komponenten in Open-Source-Projekten zu sprechen .

Gleichzeitig wurde die Software auf Version 1.60 aktualisiert, die die Registrierung neuer Benutzer unterstützt, und Sie können kein einheitliches Testkonto mehr verwenden.

Sie können es über den folgenden Pfad herunterladen:

1. Laden Sie das Projekt auf GitHub herunter, laden Sie es lokal herunter, generieren Sie es und Sie können die neueste Version von erhalten das Programm.

2. Benutzer, die die Betaversion v0.5 ausführen, können in der oberen rechten Ecke des Programms direkt auf „Aktualisieren“ klicken.

3 Das endgültige Paket für Nicht-Microsoft-Entwickler ist das folgende komprimierte Paket, das direkt dekomprimiert werden kann.


Wenn Sie immer noch nicht wissen, was die Software ist, können Sie sich diesen Blog-Beitrag ansehen:

[WPF MaterialDesign-Beispiel-Open-Source-Projekt] Work Zeitmanager

Heute sprechen wir über die clientseitige Protokollkomponente.

Ich weiß nicht, ob Komponenten geeignet sind. Es sind jedenfalls kleine Module, die Teil der Software sind und wiederverwendet werden können.

Diesmal ist die Protokollklasse eine sehr typische Komponente

1. Wird überall in der Software verwendet.

2

3. Extrem hohe Nutzung

4. Häufige io-Operationen

Als ich gerade mit c# in Kontakt kam, hatte ich Ich habe Log4net als Kind verwendet, aber damals kam mir die Idee, dass mein Programm möglicherweise nur ein paar Meter groß ist und eine Protokollkomponente größer sein würde als mein Hauptprogramm. Das war offensichtlich unangemessen.

Bevor ich vor zwei Jahren meinen Abschluss machte, begann ich mit der Herstellung meiner ersten Holzkomponente.

[.net] Erstellen Sie Ihre eigene Protokollkomponente – verbesserte Version

Die Grundidee ist immer noch gut, einschließlich: Threads, Blockierung, Ressourcenwettbewerb usw. wurden berücksichtigt.

Wie das Sprichwort sagt, hat ein neugeborenes Kalb keine Angst vor Tigern, also hat es einfach damit begonnen, ohne etwas zu wissen.

Die erste Version der Protokollkomponente wurde durch Öffnen von Threads geschrieben.

Allerdings ist er jung und das Problem ist immer noch offensichtlich. Das Eintippen von 100 Nachrichten in einer Sekunde wird nicht funktionieren.

Als ich also wieder mit der C#-Entwicklung begann, nahm ich mir etwas Zeit für die Umgestaltung.

Beginnen Sie zunächst mit der Gesamtarchitektur:
- Merkmale alter Komponenten:
* Verwenden Sie eine Multithread-Warteschlange und verwenden Sie sich gegenseitig ausschließende Variablen, um das Thread-Schreiben von Text zu steuern.
* Kontrollieren Sie den Ressourcenkonflikt durch Singleton-Sperre
* Threads werden zufällig zum Sperren ausgewählt und die geschriebene Protokollzeitsequenz ist möglicherweise falsch
* Ein Thread führt eine Textoperation aus, Schalter werden in einem Thread bedient und es wird jeweils nur eine Variable geschrieben
- Vorteile:
* Multithread-Betrieb, der die Betriebseffizienz oberflächlich verbessert
* Einzelinstanzsperre zur Gewährleistung der Einzigartigkeit
- Nachteile:
* Geringe Leistung, übermäßiger Io-Betrieb Führt zu erheblichen Redundanzen in der Leistung
* Schreiben Sie jeweils nur ein Stück
- Verbesserung
* Verwenden Sie das Producer-Consumer-Modell, separate Vorgänge , und begrenzen Sie die Anzahl der Threads
* Verwenden Sie die Stapelwarteschlange „First In, First Out“, um die Protokollreihenfolge sicherzustellen
* Einzelinstanz-IO-Variable, Schreibvorgänge in Stapeln
Transformationsergebnisse:
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);
            }
        }
    }
}

Der Code verwendet keine Komponenten von Drittanbietern, sondern nur Kopieren Sie diese Datei zur Verwendung.

Einige Sondersituationen wie die Belegung von Protokolldateien, das vorübergehende Herunterfahren der Software und Überlegungen wie die Auslösezeit der Warteschlange und die Anzahl der Batch-Schreibvorgänge haben wir vorerst nicht behandelt. Dies ist nur eine grundlegende Demo,

Wenn Sie über spätere Verbesserungen informiert werden möchten, können Sie natürlich dem GitHub des Projekts folgen.

Natürlich freue ich mich über deine besseren Vorschläge und lass uns gemeinsam lernen. Wenn du eine gute Idee hast, sie aber nicht selbst schreiben willst, helfe ich dir, sie umzusetzen !


Das obige ist der detaillierte Inhalt vonEinführung in das Open-Source-Beispielprojekt WPF MaterialDesign. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn