[英]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.