C# 创建简单的异步工作流活动 我试图进入工作流基金会,但显然我似乎无法获得一个异步活动的最基本的实现。

C# 创建简单的异步工作流活动 我试图进入工作流基金会,但显然我似乎无法获得一个异步活动的最基本的实现。,c#,asynchronous,workflow-foundation,C#,Asynchronous,Workflow Foundation,有没有人能为我指明正确的方向,让我一起完成这个活动,以便使用HttpClient发出异步OData请求 首先,我创建了一个从AsyncCodeActivity扩展而来的基类型 public abstract class ODataActivity<TResult> : AsyncCodeActivity<TResult>, IDisposable { protected HttpClient Api = new HttpClient(

有没有人能为我指明正确的方向,让我一起完成这个活动,以便使用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;
        }
    }
}
公共抽象类ODataActivity:AsyncCodeActivity,IDisposable
{
受保护的HttpClient Api=
新的HttpClient(
新的HttpClientHandler(){AutomaticDecompression=DecompressionMethods.GZip | DecompressionMethods.Deflate}
)
{BaseAddress=newURI(new Config().ApiRoot)};
布尔=假;
公共空间处置()
{
处置(处置);
}
公共虚拟void Dispose(bool 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;
    }
}
公共类ODataFetchActivity:ODataActivity
{
公共字符串查询{get;set;}
受保护的重写IAsyncResult BeginExecute(AsyncCodeActivityContext上下文、AsyncCallback回调、对象状态)
{
var task=Api.GetAsync(查询)
.ContinueWith(t=>t.Result.Content.ReadAsAsync())
.ContinueWith(t=>callback(t));
context.UserState=任务;
返回任务;
}
受保护的重写树结果EndExecute(AsyncCodeActivityContext上下文,IAsyncResult结果)
{
var响应=((任务)结果).result;
SetValue(结果、响应);
返回响应;
}
}
。。。由于该活动只能执行get请求,因此我可以在上述基本类型的基础上实现post、put和delete,以同样的方式获取完整的crud

当我将此添加到工作流中,并尝试在新wpf应用程序中使用重新托管的设计器执行流时,会出现以下异常

编辑:

因此,我做了更多的修补,并有一些似乎没有抱怨的东西,但我不相信这是一个“好”的方式来处理这个问题,因为任务直接实现了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;
    }
}
公共类ODataFetchActivity:ODataActivity
{
公共字符串查询{get;set;}
职能工作;
受保护的重写IAsyncResult BeginExecute(AsyncCodeActivityContext上下文、AsyncCallback回调、对象状态)
{
work=()=>Api.Get(Query.Result);
context.UserState=工作;
返回工作.BeginInvoke(回调,状态);
}
受保护的重写树结果EndExecute(AsyncCodeActivityContext上下文,IAsyncResult结果)
{
TResult response=work.EndInvoke(结果);
结果集(上下文、响应);
返回响应;
}
}

这看起来是编译和运行的,但我忍不住觉得有一种更干净的方法来处理这个问题。

嗯,显然这很好

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;
    }
}
公共类ODataFetchActivity:ODataActivity
{
公共字符串查询{get;set;}
职能工作;
受保护的重写IAsyncResult BeginExecute(AsyncCodeActivityContext上下文、AsyncCallback回调、对象状态)
{
work=()=>Api.Get(Query.Result);
context.UserState=工作;
返回工作.BeginInvoke(回调,状态);
}
受保护的重写树结果EndExecute(AsyncCodeActivityContext上下文,IAsyncResult结果)
{
TResult response=work.EndInvoke(结果);
结果集(上下文、响应);
返回响应;
}
}
我在重新托管设计器时遇到了一些奇怪的行为,它将运行以前的版本,直到保存为止(不知道为什么)