目錄
【WPF MaterialDesign 範例開源專案】 Work Time Manager
【.net】創建屬於自己的log元件-改進版
首頁 後端開發 C#.Net教程 WPF MaterialDesign 範例開源專案介紹

WPF MaterialDesign 範例開源專案介紹

Jun 23, 2017 pm 03:01 PM
manager time 開源 專案

 

Hello all , 我又回來了

 

這次我們真是開始來聊聊開源專案裡,小而有用的模組或元件的開發思想。

 

同時,軟體已經更新到1.60的版本了,支援新用戶註冊,可以不再使用統一的test帳戶了。

 

您可以透過以下路徑進行下載:

1、在GitHub上fellow一下項目,下載到本地,產生一下,即可取得最新版程式。

2、本地是beta v0.5版本的使用者可以直接在程式右上角點擊更新

#3、最後給非微軟系開發者的是以下的壓縮包,直接解壓縮即可使用。


如果你還不知道是什麼軟體,可以查看這篇文章:

【WPF MaterialDesign 範例開源專案】 Work Time Manager

今天,我們來聊聊客戶端的日誌元件。

 

我也不知道說元件合不合適,反正就是屬於軟體一部分並且可以被重複利用的小模組我稱之為元件。

這次的日誌類別就是很典型的一個元件,日誌有很多特點;

1、會被使用在軟體的任意一個地方

2、隨時都會被召喚

3、使用率極高

4、頻繁的io運算

 

 

在我剛剛接觸c#的時候,就使用過了Log4net,但是,那時候就萌生的想法是,我一個程式可能也才幾m大小,一個日誌元件就比上我一個主程式了,這明顯是不合適的。

於是兩年前還沒畢業的我著手做了自己的第一個日誌組件。

【.net】創建屬於自己的log元件-改進版

基礎的想法還是好的,包括:線程,阻塞,資源競爭等都做了一定的考慮。

俗話說初生牛犢不怕虎,啥也不太知道的自己就這麼開乾了。

寫了第一版透過開啟執行緒來做的日誌元件。

 

 

可是,畢竟年輕,問題還是顯而易見的。一秒打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);
            }
        }
    }
}
登入後複製
 

程式碼沒有第三方元件的應用,直接複製這個檔案即可使用。

現在暫時沒有對一些特殊情況做處理,例如日誌檔案被佔用、軟體暫時關閉,以及佇列觸發時間和批次寫入個數等考慮,這只是一個最基礎的demo,

當然,如果你想知道後續的改進方法,可以關注該專案的GitHub 。

 

當然,期待你們更好的建議,大家一起學習,你有好的想法,自己又不想寫,我來幫你實現!


以上是WPF MaterialDesign 範例開源專案介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

十個推薦開源免費文字標註工具 十個推薦開源免費文字標註工具 Mar 26, 2024 pm 08:20 PM

文字標註工作是將標籤或標記與文字中特定內容相對應的工作。其主要目的是為文本提供額外的信息,以便進行更深入的分析和處理,尤其是在人工智慧領域。文字標註對於人工智慧應用中的監督機器學習任務至關重要。用於訓練AI模型,有助於更準確地理解自然語言文本訊息,並提高文本分類、情緒分析和語言翻譯等任務的表現。透過文本標註,我們可以教導AI模型識別文本中的實體、理解上下文,並在出現新的類似數據時做出準確的預測。本文主要推薦一些較好的開源文字標註工具。 1.LabelStudiohttps://github.com/Hu

15個值得推薦的開源免費圖片標註工具 15個值得推薦的開源免費圖片標註工具 Mar 28, 2024 pm 01:21 PM

圖像標註是將標籤或描述性資訊與圖像相關聯的過程,以賦予圖像內容更深層的含義和解釋。這個過程對於機器學習至關重要,它有助於訓練視覺模型以更準確地識別圖像中的各個元素。透過為圖像添加標註,使得電腦能夠理解圖像背後的語義和上下文,從而提高對圖像內容的理解和分析能力。影像標註的應用範圍廣泛,涵蓋了許多領域,如電腦視覺、自然語言處理和圖視覺模型具有廣泛的應用領域,例如,輔助車輛識別道路上的障礙物,幫助疾病的檢測和診斷透過醫學影像識別。本文主要推薦一些較好的開源免費的圖片標註工具。 1.Makesens

AI攻克費馬大定理?數學家放棄5年職業生涯,將100頁證明變代碼 AI攻克費馬大定理?數學家放棄5年職業生涯,將100頁證明變代碼 Apr 09, 2024 pm 03:20 PM

費馬大定理,即將被AI攻克?而整件事最有意義的地方在於,AI即將解決的費馬大定理,正是為了證明AI無用。曾經,數學屬於純粹的人類智力王國;如今,這片疆土正被先進的演算法所破解,所踐踏。圖片費馬大定理,是一個「臭名昭著」的謎題,在幾個世紀以來,一直困擾著數學家。它在1993年被證明,而現在,數學家們有一個偉大計畫:用電腦把證明過程重現。他們希望在這個版本的證明中,如果有任何邏輯上的錯誤,都可以由電腦檢查出來。專案網址:https://github.com/riccardobrasca/flt

深入了解PyCharm:快速刪除項目的方法 深入了解PyCharm:快速刪除項目的方法 Feb 26, 2024 pm 04:21 PM

標題:深入了解PyCharm:刪除專案的高效方式近年來,Python作為一種強大而靈活的程式語言,受到越來越多開發者的青睞。在Python專案的開發中,選擇一個高效的整合開發環境至關重要。 PyCharm作為一款功能強大的整合開發環境,為Python開發者提供了許多便利的功能和工具,其中包括快速、有效率地刪除專案目錄。以下將著重介紹如何使用PyCharm中的刪除

PyCharm實用技巧:將項目轉換為可執行EXE文件 PyCharm實用技巧:將項目轉換為可執行EXE文件 Feb 23, 2024 am 09:33 AM

PyCharm是一款功能強大的Python整合開發環境,提供了豐富的開發工具和環境配置,讓開發者更有效率地編寫和除錯程式碼。在使用PyCharm進行Python專案開發的過程中,有時候我們需要將專案打包成可執行的EXE文件,以便在沒有安裝Python環境的電腦上執行。本文將介紹如何使用PyCharm將專案轉換為可執行的EXE文件,同時給出具體的程式碼範例。首

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

阿里7B多模態文件理解大模型拿下新SOTA 阿里7B多模態文件理解大模型拿下新SOTA Apr 02, 2024 am 11:31 AM

多模態文件理解能力新SOTA!阿里mPLUG團隊發布最新開源工作mPLUG-DocOwl1.5,針對高解析度圖片文字辨識、通用文件結構理解、指令遵循、外部知識引入四大挑戰,提出了一系列解決方案。話不多說,先來看效果。複雜結構的圖表一鍵識別轉換為Markdown格式:不同樣式的圖表都可以:更細節的文字識別和定位也能輕鬆搞定:還能對文檔理解給出詳細解釋:要知道,“文檔理解”目前是大語言模型實現落地的一個重要場景,市面上有許多輔助文檔閱讀的產品,有的主要透過OCR系統進行文字識別,配合LLM進行文字理

剛剛發布!一鍵產生動漫風格圖片的開源模型 剛剛發布!一鍵產生動漫風格圖片的開源模型 Apr 08, 2024 pm 06:01 PM

向大家介紹一個最新的AIGC開源專案-AnimagineXL3.1。這個專案是動漫主題文字到圖像模型的最新迭代,旨在為用戶提供更優化和強大的動漫圖像生成體驗。在AnimagineXL3.1中,開發團隊專注於優化了幾個關鍵方面,以確保模型在效能和功能上達到新的高度。首先,他們擴展了訓練數據,不僅包括了先前版本中的遊戲角色數據,還加入許多其他知名動漫系列的數據納入訓練集中。這項舉措豐富了模型的知識庫,使其能夠更全面地理解各種動漫風格和角色。 AnimagineXL3.1引入了一組新的特殊標籤和美學標

See all articles