簡體   English   中英

帶有線程 C# 的控制台 Writeline

[英]Console Writeline with threaded C#

您好,我正在嘗試為我的控制台應用程序控制台輸出制作線程系統。

我這樣做了 KonsolStream。

public class KonsolStream
{
    ManualResetEvent _pauseEvent = new ManualResetEvent(true);
    ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
    Thread _thread;

    private string _yazi;
    private int _tip;

    public int _Tip
    {
        get => _tip;
        set => _tip = value;
    }
    public string _Yazi
    {
        get => _yazi;
        set => _yazi = value;
    }

    public void KonsolaYaz()
    {
        switch (_Tip)
        {
            case 1:
                //uyarı
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(_Yazi);
                Console.ResetColor();
                IstemciDurdur();
                break;
            case 2:
                //başarı
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine(_Yazi);
                Console.ResetColor();
                IstemciDurdur();
                break;
            case 3:
                //log
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(_Yazi);
                Console.ResetColor();
                IstemciDurdur();
                break;
            default:
                IstemciDurdur();
                break;
        }
    }
    private void IstemciDurdur()
    {
        _pauseEvent.Reset();
    }
    public void Start()
    {
        _thread = new Thread(DoWork);
        _thread.Start();
    }
    public void Resume()
    {
        _pauseEvent.Set();
    }

    public void DoWork()
    {
        while (true)
        {
            _pauseEvent.WaitOne(Timeout.Infinite);

            if (_shutdownEvent.WaitOne(0))
                break;

            KonsolaYaz();
        }
    }

}
public class KonsolMesaji : KonsolStream
{
    public KonsolMesaji(string yazi,int tip)
    {
        _Yazi = yazi;
        _Tip = tip;
    }
    public void Yaz()
    {
        Start();
    }
}

問題是當我啟動 SistemBaslat() 消息不是同步的。 有時它以寫消息開始。 有時它以再次開始,我想讓 KonsolStream 像,當我想將一些輸出寫入控制台時,我將稍后使用此流。

如果您希望保留消息的順序,則必須僅使用一個線程讀取單個隊列,並讓所有其他線程將數據推入其中。 好消息是你的代碼會簡單得多; 壞消息是你必須在你想記錄的任何地方訪問隊列(你可以創建一個靜態記錄器來緩解這個問題)。

編輯:我建議您檢查此鏈接: Simple MultiThread Safe Log Class ,而不是給您代碼。 你應該找到你所有的答案。

在閱讀您的問題時,我在問自己:您只是出於學術原因(即了解多線程系統中的日志記錄如何工作)而想了解這一點,還是真的希望在生產應用程序中使用多線程日志記錄?以后?

如果您的答案是后者,我建議您使用log4net,因為這可以通過少量配置為您提供您想要的內容。

更新
再次查看問題后,我同意 PaulF 的觀點,即仍然需要將線程的結果綁定在一起,然后將不同的桶按順序寫入控制台。 為了實現這一點,您可以使用一個類的(靜態)實例來保存每個線程的所有日志消息(為了區分線程,您可以使用線程 ID 作為鍵)並等待線程完成,然后寫入該線程的所有日志條目按順序發送到控制台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM