Вы запускаете асинхронную функцию (adapter.Start()
) и не ожидаете ее.Попробуйте изменить
var result = Task.Factory.StartNew(() => adapter.Start()).Result;
на
var result = adapter.Start().Result;
или
var result = Task.Factory.StartNew(() => adapter.Start().Result).Result;
, и я полагаю, что вы делаете ту же проблему здесь
await CollectionAccessor.ExecuteWithinScope(async collection => {...})
просто убедитесь, что CollectionAccessor.ExecuteWithinScope
будет обрабатывать ожидающую переданную ему функцию.Как
async Task CollectionAccessor.ExecuteWithinScope(Func <ICollection, Task> action)
{
...
await (action(collection));
...
}
или, по крайней мере, вернуть его
async Task CollectionAccessor.ExecuteWithinScope(Func <ICollection, Task> action)
{
...
return (action(collection));
}
UPD
Прямо здесь
public static TReturn ExecuteWithinScope<TReturn>(Func<ICatalogCollection, TReturn> func)
{
Console.WriteLine("4");
if (func == null) throw new ArgumentNullException("func");
Console.WriteLine("5");
using (var catalogCollection = Resolver())
{
Console.WriteLine("7");
return func(catalogCollection); // <<<<<<<HERE
}
}
Вы находитесьсоздание задачи, которая еще не завершена, и вы возвращаете ее и утилизируете коллекцию до ее завершения.Я думаю, вам нужно дождаться завершения задания и только после того, как оно вернется.Например,
public static async Task<TReturn> ExecuteWithinScope<TReturn>(Func<ICatalogCollection, Task<TReturn>> func)
{
Console.WriteLine("4");
if (func == null) throw new ArgumentNullException("func");
Console.WriteLine("5");
using (var catalogCollection = Resolver())
{
Console.WriteLine("7");
return await func(catalogCollection); // waiting task for completition
}
}
ИЛИ вам нужно расположить коллекцию внутри задачи, например
public static TReturn ExecuteWithinScope<TReturn>(Func<ICatalogCollection, TReturn> func)
{
Console.WriteLine("4");
if (func == null) throw new ArgumentNullException("func");
Console.WriteLine("5");
//using (var catalogCollection = Resolver()) // not in using!
{
var catalogCollection = Resolver();
Console.WriteLine("7");
return func(catalogCollection);
}
}
А затем
return await CollectionAccessor.ExecuteWithinScope(async collection =>
{
Console.WriteLine("8");
var adapter = new AsyncSearchAdapter();
Console.WriteLine("9");
var result = await adapter.GetSearchAsync();
Console.WriteLine("19");
Console.WriteLine(result);
Console.WriteLine("20");
collection.Dispose(); //// Disposing!
return "";
});
С моей точки зрения сначалаподход (await func(catalogCollection);
) - лучший