Привет всем.
Имеется следующий класс.
public static class Helper
{
public static Task ExecuteInContextAsync( Func<IContext, Task> action )
{ // Вариант №1
return ExecuteInDataContextAsync( context =>
{
action( context );
return Task.FromResult( 0 );
} );
}
public static async Task ExecuteInContextAsync( Func<IContext, Task> action )
{ // Вариант №2
await ExecuteInDataContextAsync( async context =>
{
await action( context );
return 0;
} );
}
public static async Task<T> ExecuteInContextAsync<T>( Func<IContext, Task<T>> action )
{ // Полная реализация
using ( IContext context = BuildContext() )
{
var result = await action( context );
return result;
}
}
private static IContext BuildContext()
{
return ...;
}
}
public interface IContext : IDisposable
{
}
Полная реализация метода, которая Task<T> возвращает — длинная простыня в реальном коде.
Чтобы не повторяться, метод, который без возвращаемого значения, вызывает полную версию одним из двух приведенных способов.
Может кто-нибудь объяснить какая разница между этими двумя вариантами?
PS Понимаю, что варианта там не два может быть, а четыре, и что асинхронность делегата никак не связана с асинхронностью самого метода.