Очевидно, что я создал здесь тупик в моем Execute
методе, который в основном оборачивает асинхронную реализацию.
public IEnumerable<IDataPoint> Execute(Guid batchId, Guid parameterId, DateTime startDateTime, DateTime endDateTime, int maxNumberOfDataPoints)
{
return this.ExecuteAsync(batchId, parameterId, startDateTime, endDateTime, maxNumberOfDataPoints)
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
}
public async Task<IEnumerable<IDataPoint>> ExecuteAsync(Guid batchId, Guid parameterId, DateTime startDateTime, DateTime endDateTime, int maxNumberOfDataPoints)
{
var foundDataPoints = new List<DataPoint>();
startDateTime = startDateTime.WithoutMilliseconds();
var firstDataPoint = await this.GetFirstDataPointBeforeDateTimeAsync(batchId, parameterId, startDateTime).ConfigureAwait(false);
var lastDataPoint = await this.GetFirstDataPointAfterDateTimeAsync(batchId, parameterId, endDateTime).ConfigureAwait(false);
var numberOfDatapointsToSubstract = firstDataPoint == null ? 0 : 1;
numberOfDatapointsToSubstract += lastDataPoint == null ? 0 : 1;
var dataPoints = await this.GetDataPointsBetweenDateTimesAsync(batchId, parameterId, startDateTime, endDateTime, maxNumberOfDataPoints - numberOfDatapointsToSubstract).ConfigureAwait(false);
if (firstDataPoint != null)
{
foundDataPoints.Add(firstDataPoint);
}
foundDataPoints.AddRange(dataPoints);
if (lastDataPoint != null)
{
foundDataPoints.Add(lastDataPoint);
}
return foundDataPoints.OrderBy(x => x.Timestamp);
}
Хотя ExecuteAsync
работает нормально Execute
не завершается. Я не понимаю проблемы. Кажется, это тупик, но я не вижу причины.
Обтекание ExecuteAsync
работает следующим образом, хотя:
return Task.Run(
async () =>
await this.ExecuteAsync(batchId, parameterId, startDateTime, endDateTime, maxNumberOfDataPoints)
.ConfigureAwait(false))
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
Разница, конечно, в том, что ExecuteAsync
быть завернутым в задачу.
ОБНОВЛЕНИЕ: Я думал, что ExecuteAsync
всегда будет выполняться в другом потоке, отличном от вызывающих, и при явном отключении синхронизации контекста я буду в порядке, но, очевидно, я ошибаюсь.