Cómo invocar el controlador de eventos dentro de una devolución de llamada asíncrona tal que se ejecuta en el hilo de llamada

Estoy trabajando en un proyecto / solución de VS que utilizan diferentes aplicaciones. Mi trabajo es refactorizar el proyecto y cambiarlo del uso del método xxxAsync al uso de BeginInvoke.

Me acerqué a algo similar al siguiente código:

public class AsyncTestModel {
    private delegate string DoTaskDelegate();

    public static EventHandler<TaskCompletedEventArgs> OnTaskCompleted;

    public static void InvokeTask() {
        DoTaskDelegate taskDelegate = Task;
        taskDelegate.BeginInvoke(new AsyncCallback(TaskCallback), null);
    }

    private static string Task() {
        Thread.Sleep(5000);
        return "Thread Task successfully completed.";
    }

    private static void TaskCallback(IAsyncResult ar) {
        string result = ((DoTaskDelegate)((System.Runtime.Remoting.Messaging.AsyncResult)ar).AsyncDelegate).EndInvoke(ar);
        if (OnTaskCompleted != null) {
            OnTaskCompleted(null, new TaskCompletedEventArgs(result));
        }
    }
}

public class TaskCompletedEventArgs : EventArgs {
    private string _message;

    public TaskCompletedEventArgs(string message) : base() {
        _message = message;
    }

    public string Message {
        get {
            return _message;
        }
    }
}

He probado esto en un nuevo proyecto de interfaz de usuario que he creado. El proyecto de interfaz de usuario contiene un botón y una etiqueta de controles. La interfaz de usuario tiene el siguiente código:

    private void button1_Click(object sender, EventArgs e) {
        AsyncTestModel.OnTaskCompleted += OnTaskCompleted;
        AsyncTestModel.InvokeTask();
    }

    private void OnTaskCompleted(object sender, TaskCompletedEventArgs e) {
        UpdateLabel(e.Message);
    }

    private void UpdateLabel(string message) {
        this.label1.Text = message;
    }

Después de ejecutar esto, encontré la excepción de subproceso que dice que se está accediendo al control 'label1' desde otro hilo, aparte del hilo que se creó.

¿Hay alguna manera de invocar el controlador de eventos OnTaskCompleted en el mismo hilo que llama al método BeginInvoke? Sé que solo podría usar InvokeRequired del formulario y llamar a BeginInvoke del formulario de la siguiente manera:

    private delegate void DoUpdateLabelDelegate(string message);

    private void UpdateLabel(string message) {
        if (this.InvokeRequired) {
            IAsyncResult ar = this.BeginInvoke(new DoUpdateLabelDelegate(UpdateLabel), message);
            this.EndInvoke(ar);
            return;
        }
        this.label1.Text = message;
    }

Pero la solución anterior requerirá que pregunte y aplique esa solución al otro equipo de desarrollo que maneja las aplicaciones que usan mi proyecto / solución. A esos otros desarrolladores no se les debe exigir que sepan que los métodos conectados al controlador de eventos se ejecutan desde un hilo diferente.

Gracias por adelantado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta