C#方法语句未按正确顺序执行

7Vo*_*yon 2 c#

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

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";
}
Run Code Online (Sandbox Code Playgroud)

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

我之前尝试过线程,但是对于我的生活,我无法正确使用语法,我尝试过:

Thread MyThread = new Thread(LongClass.LongFunction);

Thread MyThread = new Thread(new ThreadStart(LongClass.LongFunction));
Run Code Online (Sandbox Code Playgroud)

LongClass包含LongFunction静态方法的类在哪里?我现在将检查后台工作人员.

jas*_*son 6

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


Eri*_*ert 6

请记住,更新UI正在运行代码,就像其他任何东西一样.当您的长时间运行方法正在运行时,该线程不会执行重绘用户界面所需的任何任务.更改UI元素不会停止所有内容并重新绘制它,因为假设您更改了一千个UI元素; 你不会期望在每一个之后重绘; 在你做出所有改变之后,你会期望它们一下子发生.

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

有些人建议将"DoEvents"作为解决方法.这可以工作,但它是非常危险的.有两个原因.首先,假设用户点击两次按钮.在第一次点击的处理过程中,你做一个DoEvents,然后然后递归和嘿,现在你已经暂停了第一个按钮点击的处理,这样你就可以处理第二个按钮点击......而这不能是好.

其次,假设您正在处理一个事件,并且您执行DoEvents,这会导致您开始处理另一个事件,然后在您执行此操作时,您执行DoEvents,这会导致您开始处理第三个事件. ..而且这一直在继续.你什么时候完成第一次活动的处理?可能永远不会.记住"DoEvents"基本上意味着"专注于刚刚发生的事情而牺牲你已经在做的事情".