2017-07-06 84 views
0

我正在使用以下函數plot()來繪製谷歌地圖上的數據。現在,當我從另一個按鈕點擊事件調用相同的功能時,它不會執行,而是進入else() statement.my plot函數是如下:c#:調用方法

public void plot(double temp_lat, double temp_long, string temp_date, string temp_time, string temp_bty_value) 
{ 
     if (this.InvokeRequired) 
     { 
      // do something 
     } 
     else { this.Close(); } 
} 

我打電話從按鈕單擊事件這個功能如下:

private void button6_Click_1(object sender, EventArgs e) /// refresh button 
{ 
     this.Invoke((MethodInvoker)(() => 
        { 
         plot(28.5231445, 77.40388525, "17/06/20", "17:00:50", "82"); 
        })); 
} 

時,是什麼原因呢?我是新的援引methods.please幫助 編輯:https://stackoverflow.com/a/43797637/6412780我之所以使用調用,因爲我在不同線程的gmap上同時繪製5個標記。我爲synchronization我正在使用調用method.BUT現在我想更新我的數據。我做了一個刷新按鈕,其中包含新的經緯度(手動通過此處)在地圖上繪製。在同一UI上,我直接調用了plot()函數,但即使如此,我仍然無法執行if statement。這就是我正在做的事情。

+6

沒有理由在這裏調用。 –

+3

您已在'button6_Click_1'中調用'Invoke',所以'plot'正在UI線程中調用,因此'InvokeRequired'將返回false。目前尚不清楚有什麼令人驚訝的。 –

+0

這裏InvokeRequired並不意味着你的'plot'方法必須被調用或不需要,而是需要調用UI線程的調用 – Bond

回答

0

在WinForms中全部 UI操作 - 任何訪問任何控件實例的任何成員的任何操作 - 都需要在執行UI操作的單個線程上執行。

Invoke可由非UI線程使用以使UI線程執行代碼(可以同時使用BeginInvoke)。

但是,由UI觸發時,控件的事件處理程序將始終在UI線程上運行。所以不需要切換線程。爲了在不同的線程上運行代碼(例如,它會阻塞UI線程),有很多選項,這些日子使用async/await來讓運行時間運行它是首選。

在問題的代碼中,事件處理程序已經在使用Invoke這是毫無意義的:它已經在UI線程上。

這裏簡化一下,實際的規則對於高級用例來說是微妙的。

0

如果您嘗試訪問另一個ThreadThread專用的元素,則需要調用。從後臺線程訪問GUI元素時非常普遍。這裏有一個例子:

Thread t = new Thread(() => plot(28.5231445, 77.40388525, "17/06/20", "17:00:50", "82")); 

    public void plot(double temp_lat, double temp_long, string temp_date, string temp_time, string temp_bty_value) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke((MethodInvoker)(() => 
       { 
        this.Close(); 
       })); 
     } 
     else { 
      this.Close(); 
     } 
    } 

this似乎是一個Form。如果你從另一個Thread調用Close方法,你很可能會得到一個Exception(有許多方法可以防止這種情況發生,但那不是很好的風格)。你需要調用該方法(讓Form決定,當它準備好執行命令時)