c#方法语句没有按正确顺序执行

本文关键字:顺序 执行 方法 语句 | 更新日期: 2023-09-27 18:01:51

我似乎有一个问题,以正确的顺序执行命令,我有一个方法在我的程序:

private void  GenerateButton_Click(object sender, EventArgs e)
{
    Statuslabel.Text = "Working...";
    LongMethod();
    //Call to another Method of another class which takes 15-20 seconds to execute
    Statuslabel.Text = "Done";
}

问题似乎是,而不是分配"工作"状态标签,然后调用LongMethod,程序似乎首先执行LongMethod(),然后它改变状态标签的文本为"工作"一瞬间,然后立即将其更改为"完成"。哦,在LongMethod()执行期间,UI被锁定,因为程序是单线程的。

我之前尝试过线程,但是为了我的生命,我无法得到正确的语法,我尝试:

Thread MyThread = new Thread(LongClass.LongFunction);
Thread MyThread = new Thread(new ThreadStart(LongClass.LongFunction));

其中LongClass是包含LongFunction作为静态方法的类。

c#方法语句没有按正确顺序执行

您应该在另一个线程上执行LongMethod,以便UI线程在运行时不会阻塞。

请记住,更新UI是运行代码就像其他任何事情一样。当长时间运行的方法正在运行时,该线程不会执行重绘用户界面所需的任何任务。改变一个UI元素并不会停止一切并重新绘制它因为假设你改变了1000个UI元素;你不会期望每次都重划;你会期望它们在你做了所有的修改之后,同时发生。

长话短说,如果你想在更新之后但在长时间运行的代码之前刷新UI——也就是说,你不关心挂起UI,但你至少希望它更新——那么插入一个显式刷新UI的调用

有些人建议使用"DoEvents"作为解决方案。这可以工作,但它是超级危险的。有两个原因。首先,假设用户单击一个按钮两次。在处理第一次点击的过程中,你做了一个DoEvents,然后你递归,嘿,现在你已经暂停了第一个按钮点击的处理,这样你就可以处理第二个按钮点击了…这可不是什么好事。

第二,假设你正在处理一个事件,你做了一个DoEvents,这导致你开始处理另一个事件,然后当你这样做的时候,你做了一个DoEvents,这导致你开始处理第三个事件…这样一直持续下去。什么时候完成第一个事件的处理?潜在的。记住"DoEvents"基本上意味着"以你已经在做的事情为代价,专注于刚刚发生的事情"。

虽然我认为Jason使用另一个线程的答案是可行的,但还有另一个"邪恶"的选择。

Statuslabel.Text = "Working...";
Application.DoEvents();
LongMethod();
Statuslabel.Text = "Done";