问一个多线程的问题

Drayne 2017-11-16 04:36:51
情况是这样的,我在窗体上放了一个label 希望在一个复杂的操作结束前,把它显示出来。 有其他的办法能实现,但是想试试多线程。
但是实际的运行结果t1 线程并没有先执行,还是等到主线程结束后才执行。
但是我加了 join啊,join不是优先么。

using System;
using System.Windows.Forms;
using System.Threading;

namespace WinFormThread
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int i = 0;

Thread T1 = new Thread(Showwait);
T1.Start();
T1.Join();

while (i < 10000)
{

i++;
textBox1.Text = i.ToString();
textBox1.Refresh();
}
}

public delegate void ShowwaitDelegate();
public void Showwait()
{
if (this.labTest.InvokeRequired)
{
ShowwaitDelegate showwaitDelegate = new ShowwaitDelegate(Showwait);
this.BeginInvoke(showwaitDelegate);
}
else
{
labTest.Visible = true;
labText.Refresh();
}
}
}
}
...全文
222 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Drayne 2017-11-21
  • 打赏
  • 举报
回复
引用 8 楼 hanghangz 的回复:
把这一段 while (i < 10000) { i++; textBox1.Text = i.ToString(); textBox1.Refresh(); } 也开一个线程来处理,而不是放在主线程里面执行,可以得到你想要的结果.
好几天没上论坛,才看见,非常感谢,我加个了T2之后就可以了。
hanghangz 2017-11-20
  • 打赏
  • 举报
回复
把这一段 while (i < 10000) { i++; textBox1.Text = i.ToString(); textBox1.Refresh(); } 也开一个线程来处理,而不是放在主线程里面执行,可以得到你想要的结果.
yunqing1201 2017-11-18
  • 打赏
  • 举报
回复
主线程循环里面加 sleep 也可以,主程序中最好不要有死循环操作
Drayne 2017-11-17
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
基于你的代码,一个真正异步处理的代码应该写
        private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;

            Thread T1 = new Thread(Showwait);
            T1.Start();
        }
也就是说,时间处理过程中只要执行 T1.Start 就结束了,怎么能把主线程卡死呢?卡死了之后这就是空谈线程了,子线程反而是害虫,它把主线程卡死了还玩儿什么子线程啊?所以 Join 是绝对不应使用的。
原来是这样,我理解的概念不对呀,我再研究研究,多谢
  • 打赏
  • 举报
回复
时间处理过程中只要执行 T1.Start 就结束了 --> Click 事件处理过程中只要执行 T1.Start 就结束了 在子线程重要显示一些数据、要操作控件,可以使用 control.BeiginInvoke/Invoke 委托方式来操作控件。但是这是在子线程中操作即可,不是什么阻塞主线程然后显示。
  • 打赏
  • 举报
回复
基于你的代码,一个真正异步处理的代码应该写
        private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;

            Thread T1 = new Thread(Showwait);
            T1.Start();
        }
也就是说,时间处理过程中只要执行 T1.Start 就结束了,怎么能把主线程卡死呢?卡死了之后这就是空谈线程了,子线程反而是害虫,它把主线程卡死了还玩儿什么子线程啊?所以 Join 是绝对不应使用的。
Drayne 2017-11-16
  • 打赏
  • 举报
回复
引用 1 楼 njit_77 的回复:
this.BeginInvoke(showwaitDelegate);=> this.Invoke(showwaitDelegate);
这个我也试过,也不行, 还是等到while 执行完之后,才到 labTest.Visible = true; 这里
njit_77 2017-11-16
  • 打赏
  • 举报
回复
T1.Join();=>线程T1执行完毕之后,才会执行while语句
njit_77 2017-11-16
  • 打赏
  • 举报
回复
this.BeginInvoke(showwaitDelegate);=> this.Invoke(showwaitDelegate);

110,533

社区成员

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

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

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