【问题标题】:Thread calling problems线程调用问题
【发布时间】:2012-11-26 12:53:54
【问题描述】:

我在这方面有点新手,但我试图让黑白棋游戏上的 UI 运行在与移动选择部分不同的线程上,但我在调用按钮上的线程时遇到了一些麻烦单击

private void playerMoveOKButton_Click(object sender, EventArgs e)
{
       ReversiT.Invoke();
}

public void ReversiT() {...}

【问题讨论】:

  • 了解您使用的 UI 框架可能会有所帮助。 Windows 窗体,WPF..?

标签: c# multithreading invoke


【解决方案1】:

如果你想创建一个新线程,你可以这样做:

Thread thread = new Thread(ReversiT);
thread.Start();

Invoke 用于不同的目的。它用于在特定线程上运行方法(例如,如果您在单独的线程上运行一段代码但想要进行 UI 更改,您将需要使用 Invoke 在 UI 线程上进行这些更改)

【讨论】:

    【解决方案2】:

    我会创建一个BackgroundWorker 来为我处理所有事情,将其设置为DoWork 事件以调用您的移动方法(确保您的移动方法不会触及 UI,或者如果必须,调用控件在 UI 线程上)。

    我还设置了一个方法来更新 BackgroundWorker 的 RunWorkerCompleted 事件的 UI。

    现在在上面的按钮点击事件上,调用 BGW 的 RunWorkerAsync() 方法。

    【讨论】:

      【解决方案3】:

      你不能调用这样的方法。您只能调用委托。此外,调用 Invoke 不会产生新线程。

      您可以阅读this tutorial 了解委托,以及阅读this one 了解线程。另外,您的问题留有很大的讨论空间:

      1. 您对使用线程有什么期望?
      2. 您是否考虑过不同的后台工作选项?

      等等

      【讨论】:

        【解决方案4】:

        使用以下

        this.Invoke(ReversiT);
        

        【讨论】:

          【解决方案5】:

          我认为您需要考虑一下您实际上正在努力实现的目标。在 UI 中的单独线程上运行代码是一种用于阻止 UI 挂起的技术。但是,有些任务必须在 UI 线程上发生,因此不能从另一个线程运行。

          您需要分解逻辑,以便确定哪些部分需要在 UI 线程上运行(任何与 UI 上的控件交互的部分),从而确定可以在单独线程上运行的任何部分。

          您最终会得到如下代码(例如):

          private void playerMoveOKButton_Click(object sender, EventArgs e)
          {
              //thread is merely used as an example
              //you could also use a BackgroundWorker or a task
              var thread = new Thread(NonUiLogic);
              thread.Start();
          }
          
          private void NonUiLogic()
          {
              ...
              //execute logic that doesn't touch UI
              ...
          
              BeginInvoke(ReversiT);
          }
          
          public void ReversiT() {...}
          

          一旦你完成了这个练习,你可能会发现在 UI 线程之外实际上几乎没有什么事情可以发生,所以你真的没有从使用线程中获得任何好处。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-17
            相关资源
            最近更新 更多