您好我正在尝试为我的控制台应用程序控制台输出创建线程系统。
我这样做了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() 消息不是同步的。 有时候它会从写入消息开始。有时它会以Again开头 我想让KonsolStream像,当我想将一些输出写入控制台时,我将在稍后使用此流。
答案 0 :(得分:0)
如果您希望保留消息的顺序,则必须只使用一个线程读取单个队列并让所有其他线程将数据推入其中。好消息是你的代码会简单得多。坏消息是您必须在任何要记录的位置访问队列(您可以创建一个静态记录器来简化此操作)
编辑: 我建议你查看以下链接,而不是给你代码:https://stackoverflow.com/questions/2954900/simple-multithread-safe-log-class 你应该找到所有的答案
答案 1 :(得分:0)
在阅读您的问题时,我问自己:您是否只是想了解这一点是出于学术原因(即了解多线程系统中的登录方式是否有效)或者您是否真的想要多线程稍后登录一个高效的应用程序?
如果您的答案是后者,我建议您使用log4net,因为这可以通过一些配置为您提供您想要的内容。
<强>更新强>
在再次查看问题后,我同意PaulF的观点,即仍然需要将线程的结果绑定在一起,然后依次将不同的桶写入控制台。
为了实现这一点,你可以使用一个类的(静态)实例来保存每个线程的所有日志消息(以区分线程,你可以使用线程id作为键)并等待线程完成,然后写该线程的所有日志条目按顺序连接到控制台。