Silverlight 使用WCF RIA和;WF4

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服务器 在基本级别,应用程序的功能如下: 选择文本文件 点击“开始”按钮 事件处理程序创建跟踪批处理的用户定

我有一个现有的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)