none
跨執行緒作業無效 存取控制項 時所使用的執行緒與建立控制項的執行緒不同。 RRS feed

  • 問題

  • Dear all,

    public class Server
    {
       private sealed class MyServer
      {
          public myApp.Form1 classForm;  // There is another namespace of myApp and Form Class: Form1
           .....
           public MyServer(myApp.Form1 form1object)
            {
           classForm=form1object 
             ..............
             }

           public generate()
              {
                    Label sDatetime=((Label)classForm.Controls.Find("sDatetime",false)[0]); /// It prompt the error: 跨執行緒作業無效 存取控制項 時所使用的執行緒與建立控制項的執行緒不同。

               }
       }
    }


    How to solve???

    2009年10月15日 上午 08:08

解答

  • Hi,

    你需要參考
    Control.Invoke Method (Delegate, Object[])

    參數要串到Object陣列傳入
    form1.invoke(xxx,new Object[]{ form1, ctrlname, value});

    不過你的Delgate好像未宣告
    變數名稱跟之前的也明顯不一樣
    這程式沒消化過就拿來用吧

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2009年10月22日 上午 09:16
    2009年10月15日 上午 10:15

所有回覆

  • My case is different from this which is within form class, But my code is within another class which reference form class.

    Please help!!

    2009年10月15日 上午 08:28
  • 你是如何呼叫public generate()的 ?
    只要跨執行緒就是應該要用Invoke. 應該沒有例外


    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    2009年10月15日 上午 08:40
    版主
  • Sorry this is additional line below which really throw this exception.

    Dear all,

    public class Server
    {
       private sealed class MyServer
      {
          public myApp.Form1 classForm;  // There is another namespace of myApp and Form Class: Form1
           .....
           public MyServer(myApp.Form1 form1object)
            {
           classForm=form1object 
             ..............
             }

           public generate()
              {
                    Label sDatetime=((Label)classForm.Controls.Find("sDatetime",false)[0]); 
                    sDatetime.Text=Datetime.Now.Tostring();   /// It prompt the error: 跨執行緒作業無效 存取控制項 時所使用的執行緒與建立控制項的執行緒不同。

               }
       }
    }
    2009年10月15日 上午 08:44
  • 不要想試圖在非行程的執行緒上存取任何的 Windows Forms 使用者介面物件,就算你只是繼承自 Form 類別也一樣。
    若想要在非行程的執行緒上控制使用者介面,請使用 Control.Invoke() 跨越執行緒來存取。


    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    2009年10月15日 上午 08:57
    版主
  • could you describe more of control.invoke(...)??

    Sample code in my case , e.g.??
    2009年10月15日 上午 09:25
  • 請參考
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/d8583c65-8c13-4749-876f-f2ce935fcb9b
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/3418ee20-44f3-4f11-976f-593fec1b1da7


    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    2009年10月15日 上午 09:30
    版主
  • I have created the sub as below, But it prompt error that invalid parameters of delegate...

    public static void setFormText(myApp.Form1 form1, string CtrlName, string value)
    {
       if(form1.invokerequired)
            form1.invoke(setFormText, form1, ctrlname, value);
       else
           {
               Label label1=((Label) form1.controls.find(ctrlname,false)[0]);
               label1.text=value;
            }

    }
    2009年10月15日 上午 09:52
  • Could you help me??
    2009年10月15日 上午 09:53
  • Hi,

    你需要參考
    Control.Invoke Method (Delegate, Object[])

    參數要串到Object陣列傳入
    form1.invoke(xxx,new Object[]{ form1, ctrlname, value});

    不過你的Delgate好像未宣告
    變數名稱跟之前的也明顯不一樣
    這程式沒消化過就拿來用吧

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2009年10月22日 上午 09:16
    2009年10月15日 上午 10:15
  • Try this(可能需要根據你實際的程式碼稍微修改):

        Label dateTimeLabel = null;
    
        public generate()
        {
            dateTimeLabel =((Label)classForm.Controls.Find("sDatetime",false)[0]); 
    
            // 安全地更新 UI
            if (classForm.InvokeRequired) 
            {
                MethodInvoker mi = new MethodInvoker(this.UpdateUI);
                classForm.BeginInvoke(mi, null);
            }
            else 
            {
                UpdateUI();
            }
        }
    
        private void UpdateUI()
        {
          dateTimeLabel.Text = DateTime.Now.ToString();
        }
    
    
    

    http://huan-lin.blogspot.com/
    2009年10月15日 下午 12:26