2012-11-26 29 views
0

我有点在这一个新手,但我想获得的UI上的黑白棋游戏在不同的线程来移动选择部分运行,但我有一些麻烦,呼吁线程按钮单击线程调用问题

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

public void ReversiT() {...} 
+3

问题是什么? – looper

+1

它可能有助于了解您使用的UI框架。 Windows窗体,WPF ..? –

回答

0

我想创建一个BackgroundWorker处理了我的一切,设置它的DoWork事件打电话给你的移动方法(确保你的移动方法不接触UI,或者如果它有,调用UI线程上的控件) 。

我还成立了以更新的BackgroundWorker的RunWorkerCompleted事件的UI的方法。

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

0

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

您可以阅读this tutorial有关代表和this one关于线程。此外,您的问题留有许多讨论空间:

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

0

使用以下

this.Invoke(ReversiT); 
1

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

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

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

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线程,因此发生你真的没有什么可以从使用线程获得。