2010-04-21 66 views
0

嗨我有一个网络服务,它正在进行巨大的计算并且花费了一分多钟。长时间运行时泵信息+ C#

我已经生成了Web服务的代理文件,然后从我的客户端使用dll(当然,我生成了代理dll)。

我的客户端代码

TimeSeries3D t = new TimeSeries3D(); 
      int portfolioId = 4387919; 

      string[] str = new string[2]; 
      str[0] = "MKT_CAP"; 

      DateRange dr = new DateRange(); 
      dr.mStartDate = DateTime.Today; 
      dr.mEndDate = DateTime.Today; 

      Service1 sc = new Service1(); 
      t = sc.GetAttributesForPortfolio(portfolioId, true, str, dr); 

但由于它正在采取的很多时间服务器来计算,1分钟后,我收到了一条错误消息

的CLR已经无法从COM上下文0x33caf30转换到COM上下文0x33cb0a0 60秒。拥有目的地上下文/公寓的线程很可能要么进行非抽水等待,要么处理非常长的运行操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序无法响应或内存使用量不断累积。为了避免这个问题,所有的单线程单元(STA)线程都应该使用抽取等待原语(比如CoWaitForMultipleHandles),并在长时间运行的操作中定期抽取消息。

请指导我该怎么做?

感谢

回答

2

你是从UI线程中调用它吗?如果是这样,那就是问题所在。将长时间运行的操作放在后台线程上,然后将呼叫编组回到UI以更新它(例如,使用BackgroundWorkerControl.Invoke。)

+0

但是我没有对服务的任何控制权。我只获得了我转换为.cs文件然后转换为.dll的WSDL文件。 – Newbie 2010-04-21 09:14:13

+1

他的意思是从另一个线程调用Web服务,而不是调用Web服务的应用程序中的UI线程。 – Sekhat 2010-04-21 09:45:02

+0

is this private void Form1_Load(object sender,EventArgs e){new Thread(new ThreadStart(GetTimeSeries3D))。Start(); }私人无效GetTimeSeries3D(){/ /代码}? – Newbie 2010-04-21 10:56:31

2

您需要重构您服务接口有类似的开始/结束模式,并做长期的工作线程池中。

因此,客户端调用一次启动操作,服务器在线程池中运行此操作。 然后,客户再次调用以查看过程是否已完成(并获得结果(如果有))。

如果长时间运行的任务可以报告进度,所以客户端获得的比完成/未完成更多。