我正在使用Windows Workflow作为ASP.NET应用程序中类库的一部分。我已经阅读了有关在ASP.NET中设置WWF和使用ManualWorkflowSchedulerservice的所有建议,但是,我不确定这对我的应用程序是否有意义。
我的工作流程都是连续的,没有持久性;他们是火,忘了。客户端发出请求并稍后返回以查看结果(或在应用程序上等待)。到目前为止,我一直在使用AJAX Web服务类来解雇这个工作。
function DoWebserviceJob()
{
MywebService.DoJob(onComplete, onFailed);
}
[WebMethod]
public DoJob()
{
//code from library
}
如果客户还在,他会收到通知,如果不是,那就没关系。现在我正在使用WWF而不是直接从库中编码。我知道这有效(因为我已经完成了),但我想知道是否有一些我不知道的副作用或其他问题。我的新代码如下所示:
[WebMethod]
public DoJob()
{
WorkflowRuntime runtime = Application["RUNTIME"] as WorkflowRuntime;
MyWorkflowManager.DoJob(runtime);
}
我的班级图书馆:
public void DoJob(WorkflowRuntime runtime)
{
WorkflowInstance instance = runtime.CreateWorkflow(typeof(MyWorkflow));
instance.Start();
}
这有点简化,但整个过程就在这里。这个现在工作正常,我应该关注哪些问题?如果它是线程(这似乎是引用最多的问题),那么这与在不同线程上启动的webservice不一样吗?
答案 0 :(得分:3)
很难给你一个很好的答案,因为有很多未知数,但无论如何我都会给它看。
ASP.NET和WF最常听到的问题是两者都使用ThreadPool并且彼此不了解。这个问题主要取决于您的ASP.NET站点,WF默认情况下只使用ThreadPool中的几个线程(每个proc执行工作流4个,运行时另一个)。通常使用手动WF调度程序解决问题,因为WF然后使用主机线程,即ASP.NET使用的主机线程。现在根据您的需要,这可能是好的也可能是坏的。首先,ThreadPool的大小一直在增长,现在每个进程最多有250个线程,因此除非是高负载网站,否则ThreadPool饥饿不太可能成为问题。使用手动调度程序的缺点是所有请求(即instance.Start())都变为同步。如果您需要工作流程中的某些内容来完成请求,但是如果它是火灾并且忘记了您的ASP.NET请求现在正在等待工作流程完成或达到某个空闲状态。所以在某些情况下,使用ASP.NET应用程序中的默认调度程序会更好,这完全取决于您正在做什么和服务器负载。
要记住的一件事是,IIS将在特定时间后回收AppDomain,我相信默认情况下为25小时,或者请求数量。当发生这种情况时,WF运行时将被销毁,并且在我假设的下一个请求中,在另一个AppDomain中重新创建。如果您不使用持久性,则所有工作流状态都将丢失,现有工作流将终止。根据工作流程所花费的时间量,这可能是一个问题,也可能不是,我很难说清楚。