Создание простого действия асинхронного рабочего процесса

Я пытаюсь войти в основу рабочего процесса, но, похоже, я не могу заставить работать даже самую базовую реализацию асинхронной активности.

Может ли кто-нибудь указать мне правильное направление с этой деятельностью, которую я собрал, чтобы сделать асинхронный запрос 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;
    }
}

Кажется, что это компилируется и запускается, но я не могу не чувствовать, что есть более чистый способ справиться с этим.


person War    schedule 12.04.2018    source источник


Ответы (1)


Хм, видимо, это работает нормально...

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;
    }
}

У меня было какое-то странное поведение от повторного хостинга дизайнера, когда он запускал предыдущую версию до тех пор, пока не было сохранено (не знаю, почему)

person War    schedule 17.04.2018