Универсальный безопасный метод C#

Здравствуйте. При работе с GUI в разных потоках часто приходится делать инвокеры.
Сейчас я делаю так:

public void ClearData()
        {
            if (!Dispatcher.CheckAccess())
            {
                Dispatcher.BeginInvoke(new MethodInvoker(() =>
                {
                    ClearData();
                }));
            }
            else
            {
                /// do anything
            }
        }

А может кто нибудь знает каким образом можно написать статический метод расширения чтобы можно было применить его к любому методу в любом классе с любым количеством параметров??

Чтобы можно было всегда писать что то типа такого?

ClearData().SaveInvoke();
или
ClearData(p1,p2).SaveInvoke();
или
ClearData(p1,p2).SaveInvoke(p1,p2);

Можно async/await попробовать, оно упрощает подобное.

Проще так:

MyInvoke(() => ClearData(p1, p2));

А через расширение то как??

Пример есть?

Так а зачем оно? И к чему тут расширения если ClearData это просто функция, а не класс? Как это работать будет если мы вызвали функцию, а потом на её результате вызвали расширение? Она тогда должна не делать ничего, а вернуть какой-нибудь объект с колбэком внутри, но это странно и наоборот усложняет.

Если нужно написать обертку, чтобы не писать эту кучу кода везде, то самый простой и понятный вариант — создавать и передавать функцию как в моем примере.

Ну по async/await много примеров/статей/курсов, это крутая модная штука, которую уже добавили во многие языки, чтобы избавиться от callback hell.

Насчет хороших примеров не знаю, тут вроде бы кратко и понятно:
https://blog.stephencleary.com/2012/02/async-and-await.html

Тут объяснение как это работает внутри, вроде бы смотрел когда-то давно, не факт, что хорошее + лектор специфичный:

Так при чем тут асинк … у меня задча организовать взаимодействия с гуи между потоками.
Есть рабочий процесс который чтото делает и ему надо выводить информацию в график. Но этот же метод иногда надо вызывать в рамках своего же процесса. то есть инвокер то нужен то нет.
Но постоянно прописывать в каждом методе один и тот же код по выводу это муторно.

async/await и нужен для этого.
еще см. IProgress<T>
https://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html

По-моему можно просто всегда вызывать инвок.

Но лучше конечно убрать оттуда инвоки и использовать мой вариант с созданием колбэка.

public static void MyInvoke(Action action)
{
    if (!Dispatcher.CheckAccess())
    {
        Dispatcher.BeginInvoke(new MethodInvoker(() =>
        {
            action();
        }));
    }
    else
    {
        action();
    }
}