2014-05-19 66 views
-3

編輯2:這不是一個簡單的跨線程問題。我可以根據上面的鏈接更新控件,但它不適用於Cursor或toolStrip。不工作意味着不能工作。我收到通常的錯誤消息,該控件是在另一個線程中創建的,因此無法修改。調用不是toolStrip的選項。如何在單獨線程中的操作完成時觸發?

在一個按鈕上單擊我在一個單獨的線程中啓動一些操作。這是必要的,因爲它可能需要一段時間,我的表格通常會被凍結。我的問題是,我必須修改一些控件,並將其設置回最後,這是我無法從工作線程完成的。如何解決這個問題?

private void button1_Click(object sender, EventArgs e) 
{ 
    Cursor.Current = Cursors.WaitCursor; 
    toolStripStatusLabel1.Text = "Working..."; 
    Thread thread = new Thread(query); 
    thread.Start(); 
} 
private void query() 
{ 
    //actions 
    //here I need to set the cursor back to default 
    Cursor.Current = Cursors.Default; //but this is obviously not working 
    //and I have to set the label text to be "done" 
    //which is not working as well as invoke is not an option for toolStrips 
} 

所以我需要一些解決方案來做到上述。也許一些背景工作者在查詢()線程和動作完成後「留意」它們?

EDIT3:我可以修改與下面的代碼任何控制的任何屬性,除了工具條:

delegate void SetControlValueCallback(Control oControl, string propName, object propValue); 
    private void SetControlPropertyValue(Control oControl, string propName, object propValue) 
    { 
     if (oControl.InvokeRequired) 
     { 
      SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue); 
      oControl.Invoke(d, new object[] { oControl, propName, propValue }); 
     } 
     else 
     { 
      Type t = oControl.GetType(); 
      PropertyInfo[] props = t.GetProperties(); 
      foreach (PropertyInfo p in props) 
      { 
       if (p.Name.ToUpper() == propName.ToUpper()) 
       { 
        p.SetValue(oControl, propValue, null); 
       } 
      } 
     } 
    } 

SOLUTION:謝謝馬克·Gravell爲理念

private void query() 
{ 
    //actions 
    Invoke((Action)(() => 
    { 
     Cursor.Current = Cursors.Default; 
     toolStripStatusLabel1.Text = "done"; 
    })); 
} 

回答

0

謝謝Marc Gravell的想法

private void query() 
{ 
    //actions 
    Invoke((Action)(() => 
    { 
     Cursor.Current = Cursors.Default; 
     toolStripStatusLabel1.Text = "done"; 
    })); 
} 
相關問題