Исключение «операция с несколькими потоками недопустимо» при попытке получить значение comboBox
"Cross-thread operation is not valid" exception
Я испытывал это исключение много раз, но все это время я устанавливал значение элемента управления. На этот раз я решил использовать функцию под названиемSetControlPropertyThreadSafe()
, который был предложен кем-то только на stackoverflow.com. Но на этот раз я получаю это исключение, когда пытаюсь получить значение comboBox. Вот код:
string cat;
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Trim().Length > 20)
{
System.Threading.Thread t = new System.Threading.Thread(addQuickTopic);
t.Start();
}
else
MessageBox.Show("The length of the title must be greater than 20", "Title length invalid", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
public string tTitle="";
void addQuickTopic()
{
Global.SetControlPropertyThreadSafe(button1, "Text", "Working...");
Global.SetControlPropertyThreadSafe(button1, "Enabled", false);
Topic t = new Topic();
t.setTitle(textBox1.Text);
t.setDescription(" ");
t.setDesID(Global.getMd5Hash(Common.uid+DateTime.Today.ToString()+DateTime.Today.Millisecond.ToString()));
t.setUsrID(Common.uid);
t.setReplyToID("");
t.setConDate("0");
cat = CategoryList.SelectedValue.ToString();
Как вы можете видеть, я получаю textBox1.Text напрямую, без применения каких-либо потоковых операций. Но в последней строке при попытке выбрать выбранное значение comboBox я получаю это исключение. Так может кто-нибудь предложить мне, что делать в этой ситуации? Ниже приведен код моей поточно-ориентированной функции для установки значения элемента управления:
public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)
{
try
{
if (control.InvokeRequired)
{
control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue });
}
else
{
control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });
}
}
catch (Exception)
{ }
}
Должен ли я создать похожийget
функционировать? Или любое другое решение доступно?