我的C#中的winform应用程序出了问题。 在程序中,我有一个标签作为状态栏和这样的方法:
private void btnProcess_Click(object sender, EventArgs e)
{
lblStatus.Text = "Please wait...";
/*
Code here
*/
}
我的代码过程需要几秒钟但在处理完代码后,标签文本会发生变化,我希望它在此之前发生。
注意:我是编程的业余爱好者,我不能很好地理解英语,请简单解释一下你的解决方案。谢谢。
答案 0 :(得分:3)
您可以通过调用更新或刷新使用重绘事件来破解此操作,但真正的解决方案是使用BackgroundWorker进行更长时间的操作。
这不容易,你应该用你理解的语言找到它的教程。
答案 1 :(得分:0)
在winform应用程序中(但也在所有GUI应用程序中),不推荐在GUI线程中执行长任务。要解决您的问题,您必须使用线程(here,您可以找到完整的mdsn参考) 如果你想从另一个线程更新标签,你可以我将进行交叉线程操作。有关详细信息,请查看此question
答案 2 :(得分:0)
在对UI进行任何更改之前,始终运行并完成所有代码。这只是WinForms和WPF的基本逻辑。
您可以使用" BackgroundWorker" ,因此较长的代码会在另一个线程上运行。这样,您可以在较长的代码仍在运行时自由编辑UI元素。
答案 3 :(得分:0)
如果您使用的是.Net 4.5,则可以使用await
和async
而不是BackgroundWorker
。
您将创建一个返回任务的async
方法,并在该方法中使用Task.Run()
开始后台工作。
这是一个例子。你在传递给Task.Run()
的lambda中做了所有缓慢的工作,在那里我评论说“你们在这里做的都很慢”:
private async void btnProcess_Click(object sender, EventArgs e)
{
lblStatus.Text = "Please wait...";
await doSomeWorkAsynchronously();
lblStatus.Text = "Work completed";
}
private async Task doSomeWorkAsynchronously()
{
await Task.Run(()=>
{
// Do all your slow work here.
Thread.Sleep(5000); // Simulate slow work.
});
}
我认为这比使用BackgroundWorker
更容易。
请注意,如果所有“慢”方法都已async
(例如,如果您使用asynchronous file I/O),那么您可能只能await
每个异步操作而不是必须通过Task.Run()
创建自己的任务。
您还可以从后台任务返回值。假设您想要在后台任务完成时返回一个字符串,用于更新标签。你可以这样做:
private async void btnProcess_Click(object sender, EventArgs e)
{
lblStatus.Text = "Please wait...";
lblStatus.Text = await doSomeWorkAsynchronously();
}
private async Task<string> doSomeWorkAsynchronously()
{
return await Task.Run(()=>
{
// Do all your slow work here.
Thread.Sleep(5000); // Simulate slow work.
return "The task completed.";
});
}