如何从静态设置状态栏
How do I set the status bar from a static
我有一个表单(称为 Form1)并创建了一个带有标签和进度条的状态条(称为 toolStripProgressBar1)。我有一个函数,当您按下按钮并获取一些数据并对其进行处理时会调用它,效果很好。
我想向用户提供一些关于进度的信息,所以我想设置标签和进度条,但无法设置
private static async Task GetSurvey(string surid)
{
Form1.toolStripProgressBar1.Value = 10;
如果你不做静态的话会容易很多;在可以访问表单实例变量的方法中完成这项工作将使这变得非常微不足道。请注意,虽然您的进度条是由窗口线程更新的(== 应该),并且按钮单击事件处理程序等大多数事情都是由同一线程操作的。这意味着您单击您的按钮,创建进度条的线程将忙于执行您的长 运行ning 代码...
现在,您正在 运行 将您的任务异步化,这很好,只要确保您等待任何冗长的操作,以便窗口线程可以在此时移交给后台进程并返回其主要工作(更新 UI)否则您将看不到进度条非常有效地更新。不要尝试从不同线程上的 运行 代码更新表单控件到主窗口线程。
如果您不清楚 async/await 是如何工作的,请想象一下,在某个方法块中遇到 await
时,正在执行代码的线程将创建一个后台进程来完成等待部分,它本身将返回调用堆栈,直到它到达第一个未标记为异步的方法并从那里继续。实际上,在 windows 表单应用程序中,您希望所有响应按钮单击的 "does stuff" 代码都被标记为异步,这样您就可以将窗口线程完全从代码上下文中释放出来,然后重新开始执行每当您使用 await
时,它都会保持 UI 响应
执行此操作的另一种方法可能是调整 BackgroundWorker - 您附加一个完成工作的 DoWork 事件处理程序,并且作为此代码的一部分,它应该定期调用 ReportProgress 方法,传入一个 int 完成百分比。 BGWorker 上的 ProgressChanged 事件处理程序用于设置百分比 bar/Uu 元素 - 关键是您需要知道 DoWork 运行s 在不是窗口线程的线程上(和 windows 控件不能从创建它们的线程以外的线程访问,通常是窗口线程)所以我们不直接从 DoWork 访问进度条 - 相反我们调用 ReportProgress 并导致 ProgressChanged 事件触发,并且 BGWorker 故意安排事情,以便该事件处理程序中的代码在窗口线程上 运行(实际上是创建工作线程的线程,但这应该是相同的)
我有一个表单(称为 Form1)并创建了一个带有标签和进度条的状态条(称为 toolStripProgressBar1)。我有一个函数,当您按下按钮并获取一些数据并对其进行处理时会调用它,效果很好。
我想向用户提供一些关于进度的信息,所以我想设置标签和进度条,但无法设置
private static async Task GetSurvey(string surid)
{
Form1.toolStripProgressBar1.Value = 10;
如果你不做静态的话会容易很多;在可以访问表单实例变量的方法中完成这项工作将使这变得非常微不足道。请注意,虽然您的进度条是由窗口线程更新的(== 应该),并且按钮单击事件处理程序等大多数事情都是由同一线程操作的。这意味着您单击您的按钮,创建进度条的线程将忙于执行您的长 运行ning 代码...
现在,您正在 运行 将您的任务异步化,这很好,只要确保您等待任何冗长的操作,以便窗口线程可以在此时移交给后台进程并返回其主要工作(更新 UI)否则您将看不到进度条非常有效地更新。不要尝试从不同线程上的 运行 代码更新表单控件到主窗口线程。
如果您不清楚 async/await 是如何工作的,请想象一下,在某个方法块中遇到 await
时,正在执行代码的线程将创建一个后台进程来完成等待部分,它本身将返回调用堆栈,直到它到达第一个未标记为异步的方法并从那里继续。实际上,在 windows 表单应用程序中,您希望所有响应按钮单击的 "does stuff" 代码都被标记为异步,这样您就可以将窗口线程完全从代码上下文中释放出来,然后重新开始执行每当您使用 await
执行此操作的另一种方法可能是调整 BackgroundWorker - 您附加一个完成工作的 DoWork 事件处理程序,并且作为此代码的一部分,它应该定期调用 ReportProgress 方法,传入一个 int 完成百分比。 BGWorker 上的 ProgressChanged 事件处理程序用于设置百分比 bar/Uu 元素 - 关键是您需要知道 DoWork 运行s 在不是窗口线程的线程上(和 windows 控件不能从创建它们的线程以外的线程访问,通常是窗口线程)所以我们不直接从 DoWork 访问进度条 - 相反我们调用 ReportProgress 并导致 ProgressChanged 事件触发,并且 BGWorker 故意安排事情,以便该事件处理程序中的代码在窗口线程上 运行(实际上是创建工作线程的线程,但这应该是相同的)