C# 为什么加了线程了,程序依然假死?

星鸢 2020-06-29 06:53:03
前台UI


后台代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{

Thread th = new Thread(Test);
th.IsBackground = true;
th.Start();
}//button1_Click

private void Test()
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i);
}
}//end Test()

}//end Form1

OK,启动,点击按钮,程序便假死了,窗体拖不动,关不掉,和之前那会儿不加线程一样。
小菜刚学到这,求助各位大神,请问这是什么原因?小菜是VS2017,Framework4.6.1 。
...全文
2294 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
星鸢 2020-07-19
  • 打赏
  • 举报
回复
谢谢各位无私分享知识的大神。
星鸢 2020-07-02
  • 打赏
  • 举报
回复
感谢各路大神的帮助
datafansbj 2020-06-30
  • 打赏
  • 举报
回复
Console.WriteLine(i);
这一行会导致刷新界面,刷新之后才执行下一条。当频繁地调用这条语句时,主线程已无暇处理 UI 重绘消息,从而产生界面假死。
星鸢 2020-06-30
  • 打赏
  • 举报
回复
谢谢啊,小菜在努力学习基础中。
  • 打赏
  • 举报
回复
线程要配合Thread.Sleep(1); 使用
星鸢 2020-06-30
  • 打赏
  • 举报
回复
谢谢各位大佬,小菜学到了很多。
  • 打赏
  • 举报
回复 2
Windows 系统中有一些对象是会自动获取上下文的主线程的,即使你在“子线程”去调用它们也没用。异步调用它们是更加通用的,而且要比子线程中阻塞调用它们更好。
  • 打赏
  • 举报
回复 3
    private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(Test);
th.IsBackground = true;
th.Start();
}

private void Test()
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i);
Thread.Sleep(1);
}
}


不过,更为现代的写法是这样的
    private async void button1_Click(object sender, EventArgs e)
{
await Test();
}

private async Task Test()
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i);
await Task.Delay(1);
}
}

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧