我正在开发一个 MVC 应用程序,它在幕后使用一些 Windows 工作流来实现自动化。
我已经实现了一些代码来等待工作流完成。下面是一个示例应用程序,将问题归结为关键部分。
这个问题实际上与 WF 活动中正在进行的工作无关,而更多的是我如何等待它完成。
家庭控制器.cs
public ActionResult Index()
{
return View();
}
[HttpPost]
public JsonResult ProcessRequest()
{
int[] arr = new int[0];
var wh = new ManualResetEvent(false);
var instance = new Activities.SampleCodeActivity();
var args = new Dictionary<string, object>();
args.Add("Limit", 25);
var app = new WorkflowApplication(instance, args);
app.Completed = resultArgs =>
{
var list = (List<int>)resultArgs.Outputs["Primes"];
arr = list.ToArray();
wh.Set();
};
app.Run();
wh.WaitOne();
return Json(arr);
}
索引.cshtml
@{ ViewBag.Title = "Index"; }
<script src="../../Scripts/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
var tools = {};
tools.processRequest = function () {
$.ajax({
url: "@Url.Action("ProcessRequest")", type: "POST",
success: function (data) {
alert(data);
}
});
};
$(document).ready(function () {
tools.processRequest();
});
</script>
<h2>Index</h2>
示例代码活动.cs
public class SampleCodeActivity : CodeActivity
{
public InArgument<int> Limit { get; set; }
public OutArgument<List<int>> Primes { get; set; }
private List<int> _list = new List<int>();
protected override void Execute(CodeActivityContext context)
{
var limit = context.GetValue(Limit);
checkForPrimes(limit);
context.SetValue(Primes, _list);
}
private void checkForPrimes(int limit)
{
for (var x = 2; x <= limit; x++)
if (isPrime(x)) _list.Add(x);
}
private bool isPrime(int value)
{
for (var x = value - 1; x > 1; x--)
if (value % x == 0) return false;
return true;
}
}
我的问题是关于控制器操作中的 WaitHandle/ManualResetEvent。有没有更好的方法来使用任务等来实现这一点?我正在使用.NET 4.5。
如果没有 WaitHandle,Action 会在工作流完成之前返回。
我熟悉 WaitHandle,但感觉就像一个笨拙的解决方案。
任何帮助/指导表示赞赏。