自動化のために舞台裏でWindowsワークフローを使用するMVCアプリケーションに取り組んでいます。
ワークフローが完了するまで待機するコードをいくつか実装しました。以下は、問題をその重要な部分に要約するサンプル アプリです。
この問題は、WF アクティビティで進行中の作業とは関係ありませんが、それが完了するのをどのように待っているかについてです。
HomeController.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>
SampleCodeActivity.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 が配置されていないと、ワークフローが完了する前にアクションが返されます。
私は WaitHandle に精通していますが、扱いにくいソリューションのように感じます。
ヘルプ/ガイダンスをいただければ幸いです。