我似乎在以正确的顺序执行命令时遇到问题,我的程序中有一个方法:
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静态方法的类在哪里?我现在将检查后台工作人员.
请记住,更新UI正在运行代码,就像其他任何东西一样.当您的长时间运行方法正在运行时,该线程不会执行重绘用户界面所需的任何任务.更改UI元素不会停止所有内容并重新绘制它,因为假设您更改了一千个UI元素; 你不会期望在每一个之后重绘; 在你做出所有改变之后,你会期望它们一下子发生.
简而言之,如果您想在更新后但在长时间运行的代码之前刷新UI - 也就是说,您不关心挂起UI但至少希望它更新 - 那么插入一个调用显式刷新UI.
有些人建议将"DoEvents"作为解决方法.这可以工作,但它是非常危险的.有两个原因.首先,假设用户点击两次按钮.在第一次点击的处理过程中,你做一个DoEvents,然后然后递归和嘿,现在你已经暂停了第一个按钮点击的处理,这样你就可以处理第二个按钮点击......而这不能是好.
其次,假设您正在处理一个事件,并且您执行DoEvents,这会导致您开始处理另一个事件,然后在您执行此操作时,您执行DoEvents,这会导致您开始处理第三个事件. ..而且这一直在继续.你什么时候完成第一次活动的处理?可能永远不会.记住"DoEvents"基本上意味着"专注于刚刚发生的事情而牺牲你已经在做的事情".
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |