У меня есть функцияThread Control.Invoke
public void ShowAllFly()
{
cbFly.Items.Clear();
cbFly.Items.Add("Uçuş Seçiniz...");
dsFlyTableAdapters.tblFlyTableAdapter _t=new KTHY.dsFlyTableAdapters.tblFlyTableAdapter();
dsFly _mds = new dsFly();
_mds.EnforceConstraints = false;
dsFly.tblFlyDataTable _m = _mds.tblFly;
_t.Fill(_m);
foreach (DataRow _row in _m.Rows)
{
cbFly.Items.Add(_row["FlyID"].ToString()+"-"+_row["FlyName"].ToString() + "-" + _row["FlyDirection"].ToString() + "-" + _row["FlyDateTime"].ToString());
}
_Thread.Abort();
timer1.Enabled = false;
WaitPanel.Visible = false;
}
В Form_Load функции, как это;
{
_Thread = new System.Threading.Thread(new System.Threading.ThreadStart(ShowAllFly));
_Thread.Start();
_Thread.Priority = System.Threading.ThreadPriority.Normal;
}
Но когда я запускаю его;
в функции ShowAllFly
cbFly.Items.Clear(); ---- HERE Gives ERROR LIKE Control.Invoke must be used to interact with controls created on a separate thread.
В чем проблема?
Хорошее решение; byt Я бы рекомендовал использовать «Action» из рамки, а не катиться (и поддерживать) свой. –
Yep .. это в значительной степени стандартный способ сделать это. Причина, по которой это необходимо, заключается в том, что textBox1.Text может быть изменен только в потоке, в котором было создано текстовое поле - вызов - это процесс, используемый для возврата к этому потоку. –
@Fredrik: Вы правы, но этот пример чаще встречается, во многом потому, что он был вокруг дольше. Любой из них будет работать. –