如何从静态[重复]设置状态栏

问题描述 投票:-2回答:1

这个问题在这里已有答案:

我有一个表单(称为Form1),我创建了一个状态条(称为toolStripProgressBar1),带有标签和进度条。我有一个函数,当你按下一个按钮并获取一些数据并处理它时,它被调用,效果很好。

我想向用户提供有关其进度的一些信息,所以我想设置标签和进度条但我无法设置它

private static async Task GetSurvey(string surid)
{
    Form1.toolStripProgressBar1.Value = 10;
c# winforms statusbar
1个回答
0
投票

如果你不把它当作静态那么会容易得多;在有权访问表单实例变量的方法中完成工作会使这非常简单。请注意,您的进度条是(==应该)由窗口线程更新,并且大多数事情(如按钮单击事件处理程序)由同一个线程操作。这意味着您单击按钮,创建进度条的线程忙于执行长时间运行的代码...现在,您正在运行任务异步,这很好,只需确保等待任何冗长的操作,以便窗口线程可以在此时切换到后台进程并返回其主要作业(更新UI),否则您将无法非常有效地更新进度条。不要尝试将表单控件从在不同线程上运行的代码更新到主窗口线程。如果您不清楚isync / await是如何工作的,可视化它在某个方法块中遇到await时,执行代码的线程将创建一个后台进程来完成await'd部分,它本身将返回调用堆栈直到它到达第一个未标记为异步的方法并从那里继续。在Windows窗体应用程序的实际应用中,您希望所有代码都“响应”按钮单击以确定为异步,这样您就可以完全从代码上下文中释放窗口线程,然后返回到保持UI响应,无论何时使用等待

另一种方法可能是调整BackgroundWorker - 你附加一个DoWork事件处理程序来完成工作,作为这段代码的一部分,它应该定期调用ReportProgress方法,传入一个int百分比完成。 BGWorker上的ProgressChanged事件处理程序用于设置百分比bar / Uu元素 - 您需要知道DoWork在不是窗口线程的线程上运行(并且不能从线程以外的线程访问窗口控件)创建它们,通常是窗口线程)所以我们不直接从DoWork访问进度条 - 而是我们调用ReportProgress并导致ProgressChanged事件触发,BGWorker故意安排事情,以便该事件处理程序中的代码运行在窗口线程上(实际上是创建工作者的线程,但这应该是相同的)

© www.soinside.com 2019 - 2024. All rights reserved.