c# – 使用TPL处理WF 4.0长时间运行的活动
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用TPL处理WF 4.0长时间运行的活动,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1701字,纯文字阅读大概需要3分钟。
内容图文
![c# – 使用TPL处理WF 4.0长时间运行的活动](/upload/InfoBanner/zyjiaocheng/797/3d7cfd82a72d46aba6958759cc0c120e.jpg)
我创建了一个执行Web请求的活动,并将结果存储到数据库中.通常这个过程大约需要1个小时,这会使工作流引擎表现异常.我发现对于这些长时间运行的活动,我应该编写一些不同的代码,以便不会阻止工作流引擎线程.
研究一些关于编写长期运行活动的博客,我理解我应该使用Bookmark概念.但我没有使用TPL和Task的任何解决方案.
此代码对于使用Tasks处理长时间运行的活动是否正确?
public sealed class WebSaveActivity : NativeActivity
{
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark("websave", (activityContext, bookmark, value) =>
{
});
Task.Factory.StartNew(() =>
{
GetAndSave(); // This takes 1 hour to accomplish.
context.RemoveBookmark("websave");
});
}
protected override bool CanInduceIdle
{
get
{
return true;
}
}
}
解决方法:
我刚看到你的相关问题:How to write a long running activity to call web services in WF 4.0
另一种方法是将您的活动实现为AsyncCodeActivity:
namespace MyLibrary.Activities
{
using System;
using System.Activities;
public sealed class MyActivity : AsyncCodeActivity
{
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
var delegateToLongOperation = new Func<bool>(this.LongRunningSave);
context.UserState = delegateToLongOperation;
return delegateToLongOperation.BeginInvoke(callback, state);
}
protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
var longOperationDelegate = (Func<bool>) context.UserState;
var longOperationResult = longOperationDelegate.EndInvoke(result);
// Can continue your activity logic here.
}
private bool LongRunningSave()
{
// Logic to perform the save.
return true;
}
}
}
工作流实例保留在内存中,但至少工作流运行时可以处理其正常的调度任务,而其中没有一个线程被长时间运行的进程占用.
内容总结
以上是互联网集市为您收集整理的c# – 使用TPL处理WF 4.0长时间运行的活动全部内容,希望文章能够帮你解决c# – 使用TPL处理WF 4.0长时间运行的活动所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。