следует избегать, если это абсолютно необходимо.
у несколько приемлемых методов, и я нашел много способов сделать это в Интернете. Поэтому я пришел сюда, чтобы узнать, что на самом деле происходит на каждом пути, и если какие-то пути должны быть изгнаны.
Насколько я знаю, есть два вида ожидаемых методов:
Те, которые вызывают другие ожидаемые методы:public async Task<Foo> GetFooAsync()
{
var foo = await TrulyGetFooAsync();
// Do stuff with foo
return foo;
}
Я не нашел другого способа сделать это, и я думаю, что это правильный путь. Скажи мне, если я ошибаюсь!
Те, которые вызывают только нежелательные методы:И тут проблемы приходят мне на ум.
Например, я видел это:
Пример 1public async Task<Foo> GetFooAsync()
{
return await Task.Run(() => TrulyGetFoo());
}
Насколько я понимаю, ключевые слова async / await бесполезны, и этого можно избежать:
Пример 2public 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
???
Но недавно я нашел такой способ:
Пример 3public Task<Foo> GetFooAsync()
{
TaskCompletionSource<Foo> tcs = new TaskCompletionSource<Foo>();
tcs.SetResult(TrulyGetFoo());
return tcs.Task;
}
Если я правильно понял, ожидаемый метод не всегда работает в другом потоке ??? Я предполагаю, что третий пример обеспечивает этот механизм (но как ??? я вижу только синхронный код в третьем примере), когда примеры 1 и 2 всегда будут выполняться в рабочем потоке ???
Может быть, есть еще другие способы написания приемлемых методов, поэтому дайте мне знать о них.