【问题标题】:Threading trouble with windows formsWindows 窗体的线程问题
【发布时间】:2012-02-29 06:58:42
【问题描述】:

好吧,所以我很难弄清楚如何在继续执行代码之前等待线程完成而不冻结 windows 窗体..

示例代码:

var ct = new System.Threading.Thread(solve);
ct.IsBackground = true;
ct.Name = "Solving";
//start our thread
ct.Start();
ct.Join();
label33.Invoke((MethodInvoker)delegate { label33.Text = "Submitting..."; });
clickPost("name", textBox27.Text);

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    ct.Join() 的调用只有一个目的 - 阻塞直到相关线程完成。

    如果不想阻塞,则需要通过事件等其他机制处理后台“工作”完成的通知。

    通过使用BackgroundWorker 为您(在正确的用户界面线程上)发出通知,这大大简化了 Windows 窗体。

    【讨论】:

      【解决方案2】:

      如果我对您的理解正确,您只需为某些异步操作创建回调。 您可以使用委托的 BeginInvoke 回调参数。请记住,委托及其回调将在自己的线程中执行:

      Action backgroundAction = new Action(DoAction);
      backgroundAction.BeginInvoke(ActionCallback, null);
      
      private void DoAction()
      {
          //some background task
      }
      
      private void ActionCallback(IAsyncResult result)
      {
         //will be executed after
      }
      

      【讨论】:

      • 你不应该在某个地方给EndInvoke打电话吗?
      • EndInvoke 如果您需要从 DoAction() 获得一些结果,可以使用。在我的示例中,DoAction() 声明为 void。如果您使用另一个带返回值的委托,那么获得此结果的唯一方法是使用 EndInvoke。
      • Action 有问题...“使用泛型类型 'System.Action' 需要 1 个类型参数”
      • 是的,我忘记了例外情况...谢谢。
      • 我想知道你从哪里得到这个错误?如果您使用我的代码,则不会出现此类错误。我不使用通用版本的 Action。
      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多