Сообщения насоса при длительных операциях + C # - PullRequest
0 голосов
/ 21 апреля 2010

Привет, у меня есть веб-сервис, который выполняет огромные вычисления и занимает больше минуты.

Я сгенерировал прокси-файл веб-службы, а затем со стороны моего клиента я использую 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 ]

2 голосов
/ 21 апреля 2010

Вы вызываете это из потока пользовательского интерфейса?Если так, то это проблема.Поместите длительные операции в фоновые потоки, затем маршал перезвонит в пользовательский интерфейс, чтобы обновить его (например, BackgroundWorker или Control.Invoke.)

2 голосов
/ 21 апреля 2010

Вам необходимо провести рефакторинг своего сервисного интерфейса, чтобы иметь что-то вроде шаблона Begin / End, и выполнить большую работу в пуле потоков.

Таким образом, клиент вызывает один раз, чтобы начать операцию, сервер запускает это в пуле потоков. Затем, позже, клиент снова звонит, чтобы увидеть, завершился ли процесс (и получить результаты, если он есть).

Если долгосрочное задание может сообщить о прогрессе, то клиент получит больше, чем «выполнено» / «не выполнено», тем лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...