MVC 응용 프로그램에서 작업 중이며 자동화 작업을 위해 백그라운드에서 Windows Workflow를 사용합니다.WaitHandle이 최상의 옵션입니까?
워크 플로우가 완료되기를 기다리는 코드를 구현했습니다. 아래는 문제를 중요한 부분에 집중시키는 샘플 앱입니다.
문제는 실제로 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);
}
Index.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;
}
}
내 질문은 Controller Action의 WaitHandle/ManualResetEvent에 관한 것입니다. 작업 등을 사용하여이를 구현하는 더 좋은 방법이 있습니까? .NET 4.5 사용하고 있습니다.
WaitHandle이 제자리에 없으면 작업 흐름이 완료되기 전에 작업이 반환됩니다.
저는 WaitHandle에 익숙하지만 괴상한 해결책이라고 생각합니다.
도움/안내를 부탁드립니다.
나는 생각이 없지만 대답을 얻고 싶습니다. 나는 waithandles를 사용한다 - 나는 그들을 좋아하지 않는다. GOTO보다 "거친"느낌 : –