Я пытаюсь войти в основу рабочего процесса, но, похоже, я не могу заставить работать даже самую базовую реализацию асинхронной активности.
Может ли кто-нибудь указать мне правильное направление с этой деятельностью, которую я собрал, чтобы сделать асинхронный запрос OData с использованием HttpClient...
Сначала я создал базовый тип, расширяющийся от AsyncCodeActivity...
public abstract class ODataActivity<TResult> : AsyncCodeActivity<TResult>, IDisposable
{
protected HttpClient Api =
new HttpClient(
new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }
)
{ BaseAddress = new Uri(new Config().ApiRoot) };
bool disposed = false;
public void Dispose()
{
Dispose(disposed);
}
public virtual void Dispose(bool disposed)
{
if (!disposed)
{
Api.Dispose();
Api = null;
}
}
}
Затем я наследую это, чтобы обеспечить свою реализацию...
public class ODataFetchActivity<TResult> : ODataActivity<TResult>
{
public string Query { get; set; }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
var task = Api.GetAsync(Query)
.ContinueWith(t => t.Result.Content.ReadAsAsync<TResult>())
.ContinueWith(t => callback(t));
context.UserState = task;
return task;
}
protected override TResult EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
var response = ((Task<TResult>)result).Result;
context.SetValue(Result, response);
return response;
}
}
... идея в том, что это действие может выполнять только запросы на получение, затем я мог бы реализовать сообщение, поместить и удалить, чтобы получить полную хрень таким же образом поверх моего базового типа выше.
Проблема возникает, когда я добавляю это в рабочий процесс и пытаюсь выполнить поток, используя повторно размещенный дизайнер в новом приложении wpf, что приводит к следующему исключению...
Редактировать:
Итак, я немного повозился и получил что-то, что, кажется, не жалуется, но я не уверен, что это «хороший» способ справиться с этим, поскольку Task реализует IAsyncResult напрямую, и мне кажется, что я прыгаю через кучу обручей. Мне, пожалуй, не нужно.
public class ODataFetchActivity<TResult> : ODataActivity<TResult>
{
public string Query { get; set; }
Func<TResult> work;
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
work = () => Api.Get<TResult>(Query).Result;
context.UserState = work;
return work.BeginInvoke(callback, state);
}
protected override TResult EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
TResult response = work.EndInvoke(result);
Result.Set(context, response);
return response;
}
}
Кажется, что это компилируется и запускается, но я не могу не чувствовать, что есть более чистый способ справиться с этим.