Исключение «операция с несколькими потоками недопустимо» при попытке получить значение 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 функционировать? Или любое другое решение доступно?

Ответы на вопрос(2)

Ваш ответ на вопрос