繁体   English   中英

创建一个简单的异步工作流活动

[英]Creating a simple Async Workflow Activity

我正试图进入工作流基础,但显然我似乎无法获得异步活动最基本的实现工作。

任何人都可以通过我放在一起的这个活动指向正确的方向,以便使用HttpClient创建异步OData请求...

首先,我创建了一个从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;
    }
}

...想法是这个活动只能获得请求,然后我可以实现一个帖子,放置和删除以在我上面的基本类型之上以相同的方式获得完整的crud。

当我将其添加到工作流并尝试使用新的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;
    }
}

这似乎是编译和运行,但我不禁感到有一种更清洁的方法来处理这个问题。

嗯显然这很好用......

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

我从设计师重新托管中得到一些奇怪的行为,它将运行以前的版本,直到保存(不明白为什么)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM