线程调用问题

时间:2012-11-26 12:53:54

标签: c# multithreading invoke

我在这方面有点新手,但是我试图让Reversi游戏的UI在不同的线程上运行到移动选择部分,但是我在调​​用按钮上的线程时遇到一些麻烦< / p>

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

public void ReversiT() {...}

5 个答案:

答案 0 :(得分:1)

如果您正在尝试创建新主题,则可以执行以下操作:

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

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

答案 1 :(得分:0)

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

您可以阅读有关委托的this tutorial和有关主题的this one。此外,您的问题留下了很多讨论空间:

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

答案 2 :(得分:0)

使用以下

this.Invoke(ReversiT);

答案 3 :(得分:0)

我会创建一个BackgroundWorker来处理我的一切,设置它的DoWork事件来调用你的移动方法(确保你的移动方法不会触及UI,或者如果必须,调用UI线程上的控件)。

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

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

答案 4 :(得分:0)

我认为你需要考虑一下你实际上是想在这里实现。在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线程之外实际上很少发生这种情况,因此使用线程确实没什么好处。