следует избегать, если это абсолютно необходимо.

у несколько приемлемых методов, и я нашел много способов сделать это в Интернете. Поэтому я пришел сюда, чтобы узнать, что на самом деле происходит на каждом пути, и если какие-то пути должны быть изгнаны.

Насколько я знаю, есть два вида ожидаемых методов:

Те, которые вызывают другие ожидаемые методы:
public async Task<Foo> GetFooAsync()
{
    var foo = await TrulyGetFooAsync();

    // Do stuff with foo

    return foo;
}

Я не нашел другого способа сделать это, и я думаю, что это правильный путь. Скажи мне, если я ошибаюсь!

Те, которые вызывают только нежелательные методы:

И тут проблемы приходят мне на ум.

Например, я видел это:

Пример 1
public async Task<Foo> GetFooAsync()
{
    return await Task.Run(() => TrulyGetFoo());
}

Насколько я понимаю, ключевые слова async / await бесполезны, и этого можно избежать:

Пример 2
public Task<Foo> GetFooAsync()
{
    return Task.Run(() => TrulyGetFoo());
}

Этот последний пример - то, чем я занимался до сих пор. О том, есть ли разница между:

Task.Run(() => TrulyGetFoo());

а также

Task.Run((Foo)TrulyGetFoo); // I don't know if the cast is required at any time but in my code, it was

???

Но недавно я нашел такой способ:

Пример 3
public Task<Foo> GetFooAsync()
{
    TaskCompletionSource<Foo> tcs = new TaskCompletionSource<Foo>();
    tcs.SetResult(TrulyGetFoo());
    return tcs.Task;
}

Если я правильно понял, ожидаемый метод не всегда работает в другом потоке ??? Я предполагаю, что третий пример обеспечивает этот механизм (но как ??? я вижу только синхронный код в третьем примере), когда примеры 1 и 2 всегда будут выполняться в рабочем потоке ???

Может быть, есть еще другие способы написания приемлемых методов, поэтому дайте мне знать о них.

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

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