为了简化我所经历的奇怪行为,我有一个名为Log的简单类,每1000毫秒触发1个日志事件。
我看到的问题是有时会出现死锁(应用程序卡住)。似乎两个锁(第一个是添加到列表的锁,第二个是从列表中“检索”的锁)在某种程度上互相阻塞。
提示: 1)将发送消息的速率从1秒降低到200毫秒似乎有所帮助(不确定原因) 2)当返回到GUI线程(使用同步上下文)并访问GUI控件时,会发生某些事情。如果我不返回到GUI线程,则两个锁可以正常工作...
谢谢大家!
public static class Log
{
public delegate void LogDel(string msg);
public static event LogDel logEvent;
public static void StartMessageGeneration ()
{
for (int i = 0; i < 1000; i++)
{
logEvent.Invoke(i.ToString());
Task.Delay(1000);
}
}
}
我有以下的Form类,它订阅了Log类的日志事件,以便可以处理它们并在一个简单的文本框中显示。 一旦收到日志消息,它就会被添加到一个列表中。每500毫秒,一个计时器对象访问该列表,以便可以将其内容显示在一个文本框中。
public partial class Form1 : Form
{
private SynchronizationContext context;
private System.Threading.Timer guiTimer = null;
private readonly object syncLock = new object();
private List<string> listOfMessages = new List<string>();
public Form1()
{
InitializeComponent();
context = SynchronizationContext.Current;
guiTimer = new System.Threading.Timer(TimerProcessor, this, 0, 500);
Log.logEvent += Log_logEvent;
}
private void Log_logEvent(string msg)
{
lock (syncLock)
listOfMessages.Add(msg);
}
private void TimerProcessor(object obj)
{
Form1 myForm = obj as Form1;
lock (myForm.syncLock)
{
if (myForm.listOfMessages.Count == 0)
return;
myForm.context.Send(new SendOrPostCallback(delegate
{
foreach (string item in myForm.listOfMessages)
myForm.textBox1.AppendText(item + "\n");
}), null);
listOfMessages.Clear();
}
}
private void button1_Click(object sender, EventArgs e)
{
Log.StartMessageGeneration();
}
}
我看到的问题是有时会出现死锁(应用程序卡住)。似乎两个锁(第一个是添加到列表的锁,第二个是从列表中“检索”的锁)在某种程度上互相阻塞。
提示: 1)将发送消息的速率从1秒降低到200毫秒似乎有所帮助(不确定原因) 2)当返回到GUI线程(使用同步上下文)并访问GUI控件时,会发生某些事情。如果我不返回到GUI线程,则两个锁可以正常工作...
谢谢大家!