2012-11-26 28 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線程,因此發生你真的沒有什麼可以從使用線程獲得。