-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";
}));
}