C# 3.0 长时间运行期间的泵信息+;C#

C# 3.0 长时间运行期间的泵信息+;C#,c#-3.0,C# 3.0,您好,我有一个web服务,它正在进行巨大的计算,需要一分钟以上的时间 我已经生成了web服务的代理文件,然后从客户端使用dll(当然我生成了代理dll) 我的客户端代码是 TimeSeries3D t = new TimeSeries3D(); int portfolioId = 4387919; string[] str = new string[2]; str[0] = "MKT_CAP";

您好,我有一个web服务,它正在进行巨大的计算,需要一分钟以上的时间

我已经生成了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已经60秒无法从COM上下文0x33caf30转换到COM上下文0x33cb0a0。拥有目标上下文/单元的线程很可能正在执行非泵送等待或在不泵送Windows消息的情况下处理长时间运行的操作。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。为避免此问题,所有单线程单元(STA)线程应使用泵送等待原语(如CoWaitForMultipleHandles),并在长时间运行操作期间定期泵送消息。

请指导我该怎么做


谢谢

您需要重构您的服务接口,使其具有类似于开始/结束模式的功能,并在线程池中完成长时间的工作

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


如果长时间运行的任务可以报告进度,那么客户端得到的比“完成”/“未完成”更多就更好了。

您需要重构服务接口,使其具有类似于开始/结束模式的内容,并在线程池中执行长时间工作

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


如果长时间运行的任务可以报告进度,那么客户端得到的比“完成”/“未完成”更多就更好了。

您是从UI线程中调用它的吗?如果是这样,那就是问题所在。将长时间运行的操作放在后台线程上,然后封送回调UI以更新它(例如,使用
BackgroundWorker
Control.Invoke

您是从UI线程中调用它吗?如果是这样,那就是问题所在。将长时间运行的操作放在后台线程上,然后封送回调UI以更新它(例如,使用
BackgroundWorker
Control.Invoke

,但我对服务没有任何控制权。我只得到了转换为.cs文件然后转换为.dll的WSDL文件。他的意思是,从另一个线程调用web服务,而不是从应用程序中用来调用web服务的UI线程。这个私有的void Form1_Load(object sender,EventArgs e){new thread(new ThreadStart(GetTimeSeries3D)).Start();}private void GetTimeSeries3D(){//code}?@Newbie:嗯,这肯定会启动一个线程。。。但是,假设您希望稍后将数据放在UI中,则需要在web服务完成后封送回UI线程。搜索控件。调用以获取更多信息。但我对服务没有任何控制权。我只得到了转换为.cs文件然后转换为.dll的WSDL文件。他的意思是,从另一个线程调用web服务,而不是从应用程序中用来调用web服务的UI线程。这个私有的void Form1_Load(object sender,EventArgs e){new thread(new ThreadStart(GetTimeSeries3D)).Start();}private void GetTimeSeries3D(){//code}?@Newbie:嗯,这肯定会启动一个线程。。。但是,假设您希望稍后将数据放在UI中,则需要在web服务完成后封送回UI线程。在控件周围搜索。调用以获取更多信息。