Хотел бы попробовать использовать AsyncCTP с TFS. В настоящее время у вас есть давно работающий метод, который вызывает RunQuery для экземпляра запроса TFS.
Query предоставляет методы APM BeginQuery() и EndQuery(). Насколько я понимаю, рекомендуемый подход к их обертыванию с помощью AsyncCTP выглядит примерно так: (пример из документации)
Task<int>.Factory.FromAsync(stream.BeginRead, stream.EndRead, buffer, offset, count, null);
Кроме того, заверните его в метод расширения, как в документах, поэтому мой фактический метод выглядит так:
public static Task<WorkItemCollection> RunQueryAsync(this Query query)
{
if (query== null)
throw new ArgumentNullException("Query");
return Task<WorkItemCollection>.Factory.FromAsync(query.BeginQuery, query.EndQuery, null);
}
... но это не компилируется. Получение ошибки intellisense «неверный аргумент», которую, честно говоря, я не могу понять, потому что типы и формат выглядят правильно. Одной из возможных проблем может быть то, что методы Query APM ожидают ICanceleableAsyncResult, тогда как фабрика задач ожидает IAsyncResult, но, глядя на API TFS, ICanceleableAsyncResult является специализацией IAsyncResult.
Не уверен, что я делаю это неправильно или это просто невозможно. Хотелось бы иметь возможность сделать это способом AsyncCTP, но, возможно, придется вернуться к шаблону APM — тьфу!