我在这方面有点新手,但是我试图让Reversi游戏的UI在不同的线程上运行到移动选择部分,但是我在调用按钮上的线程时遇到一些麻烦< / p>
private void playerMoveOKButton_Click(object sender, EventArgs e)
{
ReversiT.Invoke();
}
public void ReversiT() {...}
答案 0 :(得分:1)
如果您正在尝试创建新主题,则可以执行以下操作:
Thread thread = new Thread(ReversiT);
thread.Start();
Invoke 虽然用于其他目的。它用于在特定线程上运行方法(例如,如果您在单独的线程上运行一段代码但想要进行UI更改,则需要使用Invoke在UI线程上进行这些更改)
答案 1 :(得分:0)
你无法调用这样的方法。您只能调用委托。此外,调用Invoke
不会产生新线程。
您可以阅读有关委托的this tutorial和有关主题的this one。此外,您的问题留下了很多讨论空间:
等
答案 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线程之外实际上很少发生这种情况,因此使用线程确实没什么好处。