【问题标题】:Creating a simple Async Workflow Activity创建一个简单的异步工作流活动
【发布时间】:2018-04-12 08:42:59
【问题描述】:

我正在尝试进入工作流基础,但显然我什至无法让异步活动的最基本实现工作。

谁能通过我为使用 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;
    }
}

这似乎可以编译和运行,但我不禁觉得有一种更清洁的方法来处理它。

【问题讨论】:

    标签: c# asynchronous workflow-foundation


    【解决方案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;
        }
    }
    

    我从设计师重新托管那里得到了一些奇怪的行为,它会运行以前的版本,直到保存(不知道为什么)

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      相关资源
      最近更新 更多