我有点在这一个新手,但我想获得的UI上的黑白棋游戏在不同的线程来移动选择部分运行,但我有一些麻烦,呼吁线程按钮单击线程调用问题
private void playerMoveOKButton_Click(object sender, EventArgs e)
{
ReversiT.Invoke();
}
public void ReversiT() {...}
我有点在这一个新手,但我想获得的UI上的黑白棋游戏在不同的线程来移动选择部分运行,但我有一些麻烦,呼吁线程按钮单击线程调用问题
private void playerMoveOKButton_Click(object sender, EventArgs e)
{
ReversiT.Invoke();
}
public void ReversiT() {...}
我想创建一个BackgroundWorker
处理了我的一切,设置它的DoWork
事件打电话给你的移动方法(确保你的移动方法不接触UI,或者如果它有,调用UI线程上的控件) 。
我还成立了以更新的BackgroundWorker的RunWorkerCompleted
事件的UI的方法。
现在你上面的按钮点击事件,调用BGW的RunWorkerAsync()
方法。
您不能调用这样的方法。你只能调用委托。此外,调用Invoke
不会产生新的线程。
您可以阅读this tutorial有关代表和this one关于线程。此外,您的问题留有许多讨论空间:
等
使用以下
this.Invoke(ReversiT);
如果你想创建一个新的线程,你可以做这样的事情:
Thread thread = new Thread(ReversiT);
thread.Start();
Invoke是虽然用于不同的目的。它用于在特定线程上运行方法(例如,如果您在单独线程上运行一段代码,但想要更改UI,则需要使用Invoke在UI线程上进行这些更改)
我想你需要考虑一下,你实际上是想在这里实现。在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线程,因此发生你真的没有什么可以从使用线程获得。
问题是什么? – looper
它可能有助于了解您使用的UI框架。 Windows窗体,WPF ..? –