首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行耗时任务+更新winform

运行耗时任务+更新winform
EN

Stack Overflow用户
提问于 2014-01-15 17:53:27
回答 3查看 354关注 0票数 0

我有以下情况:

  1. 对话框窗口调用耗时的网络任务
  2. 等待任务结果

同时,我希望更新具有某些状态的进度条或文本框--因此我尝试了以下操作:

    • 背景工作者->进度条( BW )
    • UI线程中的网络任务

    • 任务->网络功能
    • 后台工作人员->进度条

在这两种情况下,在获取任务结果之前,我的GUI都不会更新。如果你能给我指明正确的方向,我会非常感激的。

代码语言:javascript
运行
复制
private void button1_Click ( object sender, EventArgs e )
{
   bw.RunWorkerAsync(); // Updates a textbox
   Task<bool> test2 = new Task<bool>( () => _AuthHandler( sender, e, textBox1.Text, textBox2.Text ) );
   try
        {
            test2.Start();
            bool result = test2.Result;
            //bool result = _AuthHandler.Invoke( sender, e, textBox1.Text, textBox2.Text );
            if ( result )
            {

                //Do Somethin..
            }
         }
    catch(Exception e) {
        //Do Something
    }
}
// -------BW TEST CODE --------//
    public void  smthn ()
    {
        textBox3.Text += ".";
    }
    void bw_DoWork ( object sender, DoWorkEventArgs e )
      {
          for(int i = 0;; i++) 
          {
              bw.ReportProgress( i );
              Thread.Sleep( 250 );
          }
       }

    bool result = false;
    void bw_RunWorkerCompleted ( object sender, RunWorkerCompletedEventArgs e )
    {
        MessageBox.Show( "Result Set" );
        result = (bool)e.Result;
    }
    void bw_ProgressChanged ( object sender, ProgressChangedEventArgs e )
    {
        if ( textBox3.InvokeRequired )
        {
            this.Invoke( new Action( smthn ) );
        }
        else
        {
            smthn();
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-15 18:00:13

您正在阻塞UI线程,直到一些非UI工作完成为止。别干那事。让UI线程执行UI工作,将非UI工作安排在另一个线程中,然后让它什么也不做;它将返回到处理其他UI事件。

BackgroundWorker是专门为让UI做一些非UI工作和用进度或结果更新UI而设计的。让BGW的DoWork方法完成实际工作,更新更新处理程序中的进度条,并在已完成的处理程序中显示结果。BGW将负责运行UI线程中除DoWork事件之外的所有事件,因此不需要手动调用UI线程。

您的代码不能工作的原因是,您通过等待任务来阻塞UI线程,而且由于任务被阻塞,BGW进度事件中计划的UI更新在整个任务完成之前没有机会运行。

票数 1
EN

Stack Overflow用户

发布于 2014-01-15 17:56:24

网络任务应该通过使用DoWork()方法在后台线程中运行,然后根据需要调用ReportProgress(),然后在主UI线程中订阅ProgressChanged事件,并更新您的ProgressBar

票数 0
EN

Stack Overflow用户

发布于 2014-01-18 07:52:04

谢谢各位..。我意识到我在阻止UI线程。因此,我创建了一个包含两个后台工作人员的泛型类:进度事件、bar和一个启动完成的事件->,它调用后处理函数。我想这是你们大多数人推荐的方法。

还有别的选择吗?那异步/等待呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21144781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档