2010-04-21 113 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

您需要重構您服務接口有類似的開始/結束模式,並做長期的工作線程池中。

因此,客戶端調用一次啓動操作,服務器在線程池中運行此操作。 然後,客戶再次調用以查看過程是否已完成(並獲得結果(如果有))。

如果長時間運行的任務可以報告進度,所以客戶端獲得的比完成/未完成更多。