在自己创建的Thread当中Sleep,发现会让主线程也卡住,为什么?
我在一个winform的main函数中,自己创建了一个线程。这个线程先睡16秒,然后通过BeginInvoke去修改textBox1.Text。代码如下所示:
我期待的结果是,主界面启动以后,所有控件都能显示。过了16秒,textBox1控件中的内容变成"Executed the given delegate"
但是实际的结果是
(1)程序启动以后变成左边的样子,一直没有响应长达16秒,界面上什么文字都显示不出来。如左图
(2)16秒以后变成右图的模样。
为什么不合我的预期呢,我对Thread/BeginInvoke的理解都不对吗?

public partial class Form1 : Form
{
public delegate void InvokeDelegate();
private void Invoke_Click(object sender)
{
textBox1.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
Thread.Sleep(16000);
textBox1.Text = "Executed the given delegate";
}
public Form1()
{
InitializeComponent();
var thread = new Thread(new ParameterizedThreadStart(Invoke_Click), 2048000);
thread.Start();
}
}
我期待的结果是,主界面启动以后,所有控件都能显示。过了16秒,textBox1控件中的内容变成"Executed the given delegate"
但是实际的结果是
(1)程序启动以后变成左边的样子,一直没有响应长达16秒,界面上什么文字都显示不出来。如左图
(2)16秒以后变成右图的模样。
为什么不合我的预期呢,我对Thread/BeginInvoke的理解都不对吗?

...全文
相关推荐
正确结束Java线程的方法
考虑以下情况:如果线程执行的方法被阻塞,那么如何执行 isCancelled 的检查呢?线程有可能永远不会去检查标志位,也就卡住了。2.
java线性编程方面
3. sleep()与wait()方法:sleep()方法属于Thread类,用于使当前线程暂停执行指定的时间,而不释放对象锁。
Python多线程中阻塞(join)与锁(Lock)使用误区解析
threads: thread.start() thread.join()```这种做法实际上会阻塞主线程,导致线程之间无法并行执行,而是顺序执行,这与多线程的初衷背道而驰。
python中telnetlib模块的使用.docx
创建一个新的线程来运行telnet操作,然后为子线程设置超时限制。这样,即使telnet连接没有按预期结束,主线程也可以在预设时间内强制结束子线程,从而控制整个操作的持续时间。
Swing 线程之SwingUtilities invokeLater docx
但是,当我们运行代码时,发现了两个问题:第一,点击开始按钮后,画面就卡住了,按钮不能点击,进度条没有被更新,输入框上也没有任何信息;第二,过了一段时间后,画面又可以操作,并且进度条被更新,输入框也出现了我们想看到的信息


