相关代码:
private delegate void AddMessageToListBox(string msg);
private AddMessageToListBox messageToListBox;
public Form1()
{
InitializeComponent();
messageToListBox = new AddMessageToListBox(MessageToListBox);
}
private void MessageToListBox(string msg)
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(messageToListBox, msg);
}
else
listBox1.Items.Add(msg);
} private void button5_Click(object sender, EventArgs e)
{
MessageToListBox("Join线程1开始");
Thread thread1 = new Thread(new ThreadStart(JoinTest1));
thread1.SetApartmentState(ApartmentState.MTA);
thread1.IsBackground = true;
thread1.Start();
thread1.Join();
MessageToListBox("Join线程1完成");
} private void JoinTest1()
{
// MessageToListBox("Join线程1进入线程内部开始");
Thread thread2 = new Thread(new ThreadStart(JoinTest2));
thread2.SetApartmentState(ApartmentState.MTA);
thread2.IsBackground = true;
thread2.Start();
thread2.Join();
// MessageToListBox("Join线程1进入线程内部结束");
}
private void JoinTest2()
{
// MessageToListBox("Join线程2内部结束");
}线程2在执行 MessageToListBox("Join线程1进入线程内部开始");这个方法时程序卡死,不知道什么原因,请大家帮我分析。
private delegate void AddMessageToListBox(string msg);
private AddMessageToListBox messageToListBox;
public Form1()
{
InitializeComponent();
messageToListBox = new AddMessageToListBox(MessageToListBox);
}
private void MessageToListBox(string msg)
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(messageToListBox, msg);
}
else
listBox1.Items.Add(msg);
} private void button5_Click(object sender, EventArgs e)
{
MessageToListBox("Join线程1开始");
Thread thread1 = new Thread(new ThreadStart(JoinTest1));
thread1.SetApartmentState(ApartmentState.MTA);
thread1.IsBackground = true;
thread1.Start();
thread1.Join();
MessageToListBox("Join线程1完成");
} private void JoinTest1()
{
// MessageToListBox("Join线程1进入线程内部开始");
Thread thread2 = new Thread(new ThreadStart(JoinTest2));
thread2.SetApartmentState(ApartmentState.MTA);
thread2.IsBackground = true;
thread2.Start();
thread2.Join();
// MessageToListBox("Join线程1进入线程内部结束");
}
private void JoinTest2()
{
// MessageToListBox("Join线程2内部结束");
}线程2在执行 MessageToListBox("Join线程1进入线程内部开始");这个方法时程序卡死,不知道什么原因,请大家帮我分析。
private delegate void AddMessageToListBox(string msg);
private AddMessageToListBox messageToListBox;
public Form1()
{
InitializeComponent();
messageToListBox = new AddMessageToListBox(MessageToListBox);
}
private void MessageToListBox(string msg)
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(messageToListBox, msg);
}
else
listBox1.Items.Add(msg);
}
object obj1 = new object();
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ParameterizedThreadStart(ParameterTest));
thread.IsBackground = true;
thread.Start("Parameter Test");
thread.Join();
MessageToListBox("Parameter Test Over");
}
private void ParameterTest(object obj)
{
lock (obj1)
{
MessageToListBox("Testing");
}
}
我发现还真是join的原因,但是有一个这样的问题,我吧lock里面换成其他内容。
MessageToListBox("Testing");
换成:
int x= (int)(2 / 1);
这样这个程序却是正常的,难道原因归结于jion?
join不是让里面的先执行完再执行后面语句?怎么试卡死了,我感觉更像是阻塞
public Form1()
{
InitializeComponent();
messageToListBox = new AddMessageToListBox(MessageToListBox);
} private void MessageToListBox(string msg)
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(messageToListBox, msg);
}
else
listBox1.Items.Add(msg);
} object obj1 = new object(); private void fun()
{
Thread thread = new Thread(new ParameterizedThreadStart(ParameterTest));
thread.IsBackground = true;
thread.Start("Parameter Test");
thread.Join();
MessageToListBox("Parameter Test Over");
} private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(fun));
t.IsBackground = true;
t.Start();
} private void ParameterTest(object obj)
{
lock (obj1)
{
MessageToListBox("Testing");
}
}
所以,不卡才怪!