none
InvokeRequired RRS feed

  • 問題

  • 各位高手門
    我用google大師 查了 InvokeRequired
    都還是有點弄不清楚  到底是什麼意思
    感覺很像 遞迴  又呼叫一次自己 
    到底  它正確的含意為何呢  ?!


    public delegate void UI(DataRow m_dr);
            public void UIDispaly(DataRow p_dr)
            {
                if (this.dataGridView_Option.InvokeRequired == true)
                {
                    this.dataGridView_Option.BeginInvoke(new UI(UIDispaly), new object[] { p_dr });
                }
                else
                {
                    g_Option_DT.Rows.InsertAt(p_dr,0);
                }
            }


    2010年2月1日 上午 08:46

解答

  • MSDN 的說明是這樣的:

    這類物件繫結到特定的執行緒,並且不是安全執行緒 (Thread-Safe)。如果您從不同的執行緒呼叫方法,則必須使用方法來封送處理對適當執行緒的呼叫。這個屬性可以用來判斷是否一定要呼叫叫用 (Invoke) 方法,此一功能在您無法確知那一個執行緒擁有控制項時,就顯得十分好用。

    這表示說如果你要在不同執行緒中對控制項成員進行呼叫的話,若 InvokeRequired = true 時,表示你一定要用 Control.Invoke() 來呼叫控制項的方法,否則有可能會發生錯誤。


    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年2月1日 上午 08:58
    版主
  • Control.InvokeRequired 屬性


    裡面有說明,這個值會指示是否由於呼叫端是在建立控制項之執行緒以外的執行緒,因此在進行控制項的方法呼叫時,應呼叫叫用 (Invoke) 方法。所以在別的執行緒,直接變更控制項內容,會造成錯誤,要用委派的方式處理...
    2010年2月1日 上午 08:59
  • Delegate 類別

    Control.BeginInvoke 方法 (Delegate, Object[])

    如同小朱大提到,不確定控制項是否同個執行緒呼叫方法,這樣做比較保險,當然也可以直接給值,但有可能會發生錯誤;這段是在建立控制項執行緒上,以指定引數執行委派,參考以上網址...
    • 已標示為解答 布利 2010年2月2日 上午 12:03
    2010年2月1日 上午 09:27
  • 會這樣寫表示可能會用在與控制項不同的 thread 中,是一種保全的方法。

    this.dataGridView_Option.BeginInvoke(new UI(UIDispaly), new object[] { p_dr });

    這一行是表示使用非同步的 Invoke() 來對控制項做變更,在你貼出來的程式中也有看到一個委派,BeginInvoke() 就是透過那個委派來控制 DataGridView,只是這程式呼叫的是相同的函數 (委派指向的也是 UIDisplay() 函數) 而已。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 布利 2010年2月2日 上午 12:03
    2010年2月1日 上午 09:28
    版主

所有回覆

  • MSDN 的說明是這樣的:

    這類物件繫結到特定的執行緒,並且不是安全執行緒 (Thread-Safe)。如果您從不同的執行緒呼叫方法,則必須使用方法來封送處理對適當執行緒的呼叫。這個屬性可以用來判斷是否一定要呼叫叫用 (Invoke) 方法,此一功能在您無法確知那一個執行緒擁有控制項時,就顯得十分好用。

    這表示說如果你要在不同執行緒中對控制項成員進行呼叫的話,若 InvokeRequired = true 時,表示你一定要用 Control.Invoke() 來呼叫控制項的方法,否則有可能會發生錯誤。


    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年2月1日 上午 08:58
    版主
  • Control.InvokeRequired 屬性


    裡面有說明,這個值會指示是否由於呼叫端是在建立控制項之執行緒以外的執行緒,因此在進行控制項的方法呼叫時,應呼叫叫用 (Invoke) 方法。所以在別的執行緒,直接變更控制項內容,會造成錯誤,要用委派的方式處理...
    2010年2月1日 上午 08:59
  • 各位高手門
    我用google大師 查了 InvokeRequired
    都還是有點弄不清楚  到底是什麼意思
    感覺很像 遞迴  又呼叫一次自己 
    到底  它正確的含意為何呢  ?!


    public delegate void UI(DataRow m_dr);
            public void UIDispaly(DataRow p_dr)
            {
                if (this.dataGridView_Option.InvokeRequired == true)
                {
                    this.dataGridView_Option.BeginInvoke(new UI(UIDispaly), new object[] { p_dr });
                }
                else
                {
                    g_Option_DT.Rows.InsertAt(p_dr,0);
                }
            }



    那請教一下 什麼時候 需要用到 InvokeRequired 
    還有   this.dataGridView_Option.BeginInvoke(new UI(UIDispaly), new object[] { p_dr });
    這一段  是啥意思
    拍謝   我很努力的看  還是看不太懂:(
    2010年2月1日 上午 09:05
  • Delegate 類別

    Control.BeginInvoke 方法 (Delegate, Object[])

    如同小朱大提到,不確定控制項是否同個執行緒呼叫方法,這樣做比較保險,當然也可以直接給值,但有可能會發生錯誤;這段是在建立控制項執行緒上,以指定引數執行委派,參考以上網址...
    • 已標示為解答 布利 2010年2月2日 上午 12:03
    2010年2月1日 上午 09:27
  • 會這樣寫表示可能會用在與控制項不同的 thread 中,是一種保全的方法。

    this.dataGridView_Option.BeginInvoke(new UI(UIDispaly), new object[] { p_dr });

    這一行是表示使用非同步的 Invoke() 來對控制項做變更,在你貼出來的程式中也有看到一個委派,BeginInvoke() 就是透過那個委派來控制 DataGridView,只是這程式呼叫的是相同的函數 (委派指向的也是 UIDisplay() 函數) 而已。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 布利 2010年2月2日 上午 12:03
    2010年2月1日 上午 09:28
    版主