【发布时间】:2015-03-17 19:56:31
【问题描述】:
我已经看到很多关于如何从不同的线程编辑 c# 表单上的控件的问题,但对我来说没有多大意义。我知道您不能从另一个线程更改任何 UI,而不是它的主线程。要完成这项工作,您必须使用 invoke 并从那里安全地编辑控件?
我有一个开始在文件中写入的按钮,当你按下按钮时,按钮本身就会被禁用,所以你不能启动多个完全相同的线程。写完后,我希望按钮再次可用,但我无法让它在另一个线程上工作。
我将此作为表单中的 Generate_Click 事件。
private void Generate_Click(object sender, EventArgs e)
{
Generate.Enabled = false;
int x = 512;
int y = 512;
MBrot mbrot = new MBrot(x, y);
PB_Update lb = new PB_Update(0, y, Generator_PB, Generate, mbrot, this);
lb.Start();
}
这是在 PB_Update.cs 中的 ThreadWork() 函数,当 while 循环完成时,文件的写入完成,线程也完成了,因此它结束并给出了一个带有“完成”的消息框,现在作为最后一个按钮需要重新启用。
public void ThreadWork()
{
while (true)
{
if (currValue_ >= maxValue_)
break;
ThreadTick();
}
mb_.StopBrot();
t_.Interrupt();
MessageBox.Show("Finished!");
Generate_.Enabled = true;
}
【问题讨论】:
-
小评论,如果只是
while (currValue_ < maxValue_),你的while条件会更有意义 -
@RufusL 实际上它不会那样工作,我真的不明白为什么。该代码是进度条的一部分,它不会“进步”但会立即停止,可能是因为它无法访问当前值和最大值。
标签: c# multithreading winforms controls invoke