War*_*War 5 c# asynchronous workflow-foundation
我正在尝试进入工作流基础,但显然我似乎无法获得异步活动的最基本实现.
任何人都可以通过我放在一起的这个活动指向正确的方向,以便使用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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
接下来我继承了它以提供我的实现......
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;
}
}
Run Code Online (Sandbox Code Playgroud)
...想法是这个活动只能获得请求,然后我可以实现一个帖子,放置和删除以在我上面的基本类型之上以相同的方式获得完整的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;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是编译和运行,但我不禁感到有一种更清洁的方法来处理这个问题.
嗯,显然这工作正常......
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我从重新托管的设计器中得到了一些奇怪的行为,它将运行以前的版本,直到保存为止(不知道为什么)