2015-02-11 5 views
-1

У меня есть метод WCF, который выполняет некоторые вычисления и вставку. Этот метод вызывается в потоке. Мой метод занимает более 45 минут (что подходит для меня), но после этого он выдает сообщение об ошибке «Истекло время ожидания». Период ожидания истекает до завершения операции или сервер не отвечает ». Только часть вставки находится в области транзакции, а в профилировщике я вижу, что вставки произошли только менее чем за минуту. Я думаю, что это нить, которая выберет время. Как увеличить время ожидания? Пожалуйста, помогитеувеличение Время автономной работы .NET

Благодарности Ranjith

+0

Ваш метод WCF за 45 минут до его ответа? – DoctorMick

+1

Связана ли эта нить с SQL-работами? Возможно, вы могли бы включить код, в котором выбрано исключение? –

+1

Вероятно, вы должны разделить приложение на две части: службу Windows и службу WCF (или разместить службу WCF в службе выигрыша). Причина в том, что пул приложений может перерабатывать в любое время и, таким образом, прерывать работу до ее завершения. Выполнение этого в службе Windows намного более стабильно. – jgauffin

ответ

0

Существует легко обойти эту проблему, которую я использовал для проекта.

У нас нет вашего кода, поэтому можно так много догадываться, но если вы не спешите получать ответ со своей части сервера WCF, вы можете фактически подпоточить свою вычислительную часть в обработчике сообщений и когда вы готовы - асинхронно - в некотором роде реагировать на ваш клиент. Таким образом, ваш обработчик сообщений может сразу ответить на ваш запрос клиента, и не произойдет ни одного тайм-аута потока.

Однако это означает, что вам, возможно, придется изменить способ работы вашего клиента/сервера, например, регулярно запрашивать у клиента запрос на сервер, если он сделан с вычислением.

Чтобы сделать простой суб-Threading в обработчике канала клиента вы могли бы сделать это:

public MyObject payload = null; 

// Called to initiate the computation on the channel 
public bool StartComputation(MyParamClass param) 
{ 
    // Reset payload to make sure 'IsComputationDone()' returns 'not ready' 
    payload = null; 

    // Start thread where computation is done 
    ThreadPool.QueueUserWorkItem(o => { 

     // Do computation with param 
     // Payload is set when computation is done 
     payload = doStuff(param); 
    } 

    return true; 
} 

// Called regularly to know if computation is ready 
public bool IsComputationDone() 
{ 
    return payload != null; 
} 

// Finally get payload 
public MyObject GetResult() 
{ 
    return IsComputationDone() ? payload : null; 
} 

Это идея. После этого вы можете добавить проверки, что вы не можете одновременно запускать два вычисления с одним и тем же каналом или, по крайней мере, управлять очередью вычислений. До вас, но это представляет собой базовый подход

+0

Хотя это МОЖЕТ быть хорошим в теории. На практике это может вызвать всевозможные проблемы (особенно если вы запускаете IIS). Если это в IIS, вызов ThreadPool будет уничтожен IIS. Возможно, это время, чтобы распознать проблему для того, что это такое, которая является очередью рабочих процессов/сообщений. – Aron

+0

Действительно, IIS является проблемой в этом случае, но в вопросе о том, что IIS задействован, не указано. Однако, если требуется IIS, вы все равно можете обойти делегирование части вычисления внешнему классическому приложению. – DarkUrse

+0

Спасибо за ответ. Код, который создает thred, находится ниже: «Dim OrdersThread As New System.Threading.Thread (AddressOf CreateOrders) OrdersThread.Start()« CreateOrders - это метод, который имеет расчет и вставку. Я не очень беспокоился о результате, так как ничего не видно на стороне клиента, как только процесс будет завершен. Я настроил почту, которая будет отправлена ​​после ее завершения. –