Silverlight 使用WCF RIA和;WF4
我有一个现有的Silverlight 5应用程序。我正在添加一个页面,允许用户在第三方数据库系统中处理数据的大量更新。该应用程序目前使用WCF RIA服务通过SOAP与第三方系统通信。更新的功能包含在我创建的Workflow 4应用程序中,并作为SL应用程序服务器端的程序集引用。最后,应用程序现在托管在运行在Windows7上的IIS7.5本地实例中;我也在调试IIS,而不是VS dev服务器 在基本级别,应用程序的功能如下:Silverlight 使用WCF RIA和;WF4,silverlight,workflow-foundation-4,wcf-ria-services,silverlight-5.0,Silverlight,Workflow Foundation 4,Wcf Ria Services,Silverlight 5.0,我有一个现有的Silverlight 5应用程序。我正在添加一个页面,允许用户在第三方数据库系统中处理数据的大量更新。该应用程序目前使用WCF RIA服务通过SOAP与第三方系统通信。更新的功能包含在我创建的Workflow 4应用程序中,并作为SL应用程序服务器端的程序集引用。最后,应用程序现在托管在运行在Windows7上的IIS7.5本地实例中;我也在调试IIS,而不是VS dev服务器 在基本级别,应用程序的功能如下: 选择文本文件 点击“开始”按钮 事件处理程序创建跟踪批处理的用户定
- 选择文本文件
- 点击“开始”按钮
- 事件处理程序创建跟踪批处理的用户定义类型的实例
- 事件处理程序创建一个新的
实例,并为BackgroundWorker
、DoWork
和ProgressChanged
事件连接处理程序RunWorkerCompleted
- 事件处理程序调用RunWorkerAsync()
DoWork
事件处理程序的缩短代码,因为大部分工作都是在这里完成的
private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs, BatchContainerControl batchProcess)
{
var worker = sender as BackgroundWorker;
// Iterate through each record of data file and call the 'UpdateAddress' function
// of the AddressDomainService which, in turn, executes the Workflow
foreach (var item in batchProcess.FileData)
{
// Check if operation has been cancelled
if (worker.CancellationPending)
{
doWorkEventArgs.Cancel = true;
break;
}
. . .
// Invoke THINKComm.CustomerAddressUpdate Workflow via AddressContext
var invokeOp = _addressDomainContext.UpdateAddress(activityData);
// 'activityData' is an instance of Dictionary<string, string>
invokeOp.Completed += (o, args) => InvokeOpOnCompleted(o, args, batchProcess);
}
}
然后,JIT调试器弹出Silverlight应用程序代码4004中的未处理错误,消息为System.ServiceModel.DomainServices.Client.DomainOperationException:Invoke操作“UpdateAddress”失败。调用COM组件返回错误HRESULT E_FAIL。
我应该提到的是,有时候,我首先得到JIT调试器。我在调试输出中看到线程仍在退出,大约10或20秒后,VS调试器弹出内存不足异常
我最好的猜测是,某处的对象(可能与DomainService有关?)没有被释放,因此内存使用正在增加。据我所知,IIS限制了应用程序可以使用的内存量,但我不知道这里是否是这样
我认为,每次处理文件中的记录时,与它的处理相关的对象都会被释放,因此总体内存使用率会非常低。但很明显,我不明白每件事是如何执行的
我还想知道使用TPL而不是BackgroundWorker
是否会有所不同?您是否尝试在发布模式下运行应用程序而不是调试?在一个运行大文件(大约30 Mb大小)的服务中,我遇到了与您类似的问题。该文件由大约30万行文本组成。在大约6500行处理时,服务崩溃,有时出现OutOfMemoryException,有时出现另一个异常。过了一会儿,我们尝试在发布模式下运行应用程序,但服务没有崩溃,实际上已经完成。我注意到,在调试模式下运行大量线程比在发布模式下使用更多内存,这是因为有了调试器。是的,我在第一次将应用部署到本地IIS时就切换到了发布模式。
at System.ServiceModel.DomainServices.Client.WebDomainClient`1.BeginInvokeCore(InvokeArgs invokeArgs, AsyncCallback callback, Object userState)
at System.ServiceModel.DomainServices.Client.DomainClient.BeginInvoke(InvokeArgs invokeArgs, AsyncCallback callback, Object userState)
at System.ServiceModel.DomainServices.Client.DomainContext.InvokeOperation(String operationName, Type returnType, IDictionary`2 parameters, Boolean hasSideEffects, Action`1 callback, Object userState)
at THINKImportSystem.Web.Address.AddressDomainContext.UpdateAddress(Dictionary`2 activityData)
at THINKImportSystem.BatchProcessPage.BwOnDoWork(Object sender, DoWorkEventArgs doWorkEventArgs, BatchContainerControl batchProcess)
at THINKImportSystem.BatchProcessPage.<>c__DisplayClass10.<StartButtonClick>b__6(Object s, DoWorkEventArgs args)
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.OnRun(Object argument)