Excepción "La operación de subprocesos no es válida" cuando se intenta obtener el valor de comboBox

"Cross-thread operation is not valid" exception

Experimenté esta excepción muchas veces, pero todas esas veces establecía el valor de un control. Ese tiempo lo resolví usando una función llamadaSetControlPropertyThreadSafe(), que fue sugerido por alguien en stackoverflow.com solamente. Pero esta vez recibo esta excepción cuando intento obtener el valor de comboBox. Aquí está el código:

 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();

Como puede ver, obtengo el textBox1.Text directamente sin aplicar ninguna operación segura de subprocesos. Pero en la última línea al intentar obtener el valor seleccionado de comboBox, obtengo esta excepción. Entonces, ¿alguien puede sugerirme qué hacer en esta situación? A continuación se muestra el código para la función de seguridad de subprocesos para establecer el valor del control:

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)
            { }
        }

¿Debo crear un similar?get ¿función? ¿O cualquier otra solución disponible?

Respuestas a la pregunta(2)

Su respuesta a la pregunta