嗨,我有一个正在进行大量计算的网络服务,并且花了一分多钟。
我已经生成了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)并在长时间运行期间定期泵送消息。
请指导我该怎么做?
由于
答案 0 :(得分:2)
您需要重构服务接口以使其具有类似Begin / End模式的功能,并在线程池中进行长时间的工作。
因此客户端调用一次启动操作,服务器在线程池中运行它。 然后,稍后,客户端再次调用以查看进程是否已完成(如果有,则获取结果)。
如果长时间运行的任务可以报告进度,那么客户端获得的不仅仅是“完成”/“未完成”,那就更好了。
答案 1 :(得分:2)
你是在UI线程中调用它吗?如果是这样,那就是问题所在。将长时间运行的操作放在后台线程上,然后将回调封送回UI进行更新(例如使用BackgroundWorker
或Control.Invoke
。)