gpt4 book ai didi

c# - 创建一个简单的异步工作流事件

转载 作者:太空狗 更新时间:2023-10-29 23:43:14 30 4
gpt4 key购买 nike

我正在尝试了解工作流基础,但显然我似乎连异步事件的最基本实现都无法正常工作。

任何人都可以通过我整理的这个事件为我指明正确的方向,以便使用 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 应用程序中使用重新托管的设计器执行流程时,问题就出现了,导致以下异常 ...

enter image description here

编辑:

所以我做了更多的修补,并且有一些似乎没有提示的东西,但我不相信这是处理这个问题的“好”方法,因为 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;
}
}

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

关于c# - 创建一个简单的异步工作流事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791880/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com