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