新线程启动时,c#窗体挂起

新线程启动时,c#窗体挂起,c#,multithreading,C#,Multithreading,我创建了新的线程并启动它 当新线程运行时,Winform将挂起(冻结) 为什么winform会挂起? 我希望WinForm在启动新线程时可以自由移动 怎么做? (我不会在这里使用线程池。) private void按钮4\u单击(对象发送者,事件参数e) { 线程t1=新线程(新线程开始(委托)() { Run(); })); t1.Start(); t1.Join(); MessageBox.Show(“完成”); } 私家车 { INTA=1; 对于(inti=1;i) 阻止调用线程,直到

我创建了新的线程并启动它
当新线程运行时,Winform将挂起(冻结)
为什么winform会挂起?
我希望WinForm在启动新线程时可以自由移动
怎么做?
(我不会在这里使用线程池。)

private void按钮4\u单击(对象发送者,事件参数e)
{
线程t1=新线程(新线程开始(委托)()
{
Run();
}));
t1.Start();
t1.Join();
MessageBox.Show(“完成”);
}
私家车
{
INTA=1;
对于(inti=1;i)

阻止调用线程,直到 实例终止

因此,您启动线程,然后加入,这意味着您的UI线程将阻塞并等待线程完成

你可以做:


您知道联接的作用吗?启动线程,然后进行联接。联接意味着当前线程将等待并阻止该线程完成。切勿在UI线程上调用thread.Join()。将Show()放入为BackgroundWorker提供的RunWorkerCompleted事件调用事件处理程序将是一个非常简单的方法。只是一个提示。使用异步void方法的唯一有效原因是在需要异步事件处理程序的情况下。这不是很明显吗?如果使用
async
修饰符标记一个方法,并且在等待任何事情的时候,intellisense甚至会告诉你删除它。好吧,也许我没有明白你的意思。重点是关于方法是无效的,而不是任务。我同意你的看法。另一个有效的原因是当你覆盖父非异步方法时。;)不要宣传:P但我做了一个视频,详细介绍了线程,这可能会帮助你更好地理解它们
        private void button4_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(new ThreadStart(delegate ()
            {
                Run();
            }));
            t1.Start();
            t1.Join();
            MessageBox.Show("Complete");
        }

        private void Run()
        {
            int a = 1;
            for (int i = 1; i <= 999999999; i++)
            {
                ++a;
            }
        }
private async void button4_Click(object sender, EventArgs e)
{
    await Task.Run(Run);
    MessageBox.Show("Complete");
}