2015-04-13 6 views
0

Итак, у меня есть функция, которая имеет длительное время ожидания во время вычислений. У меня есть конечная точка, которая должна вызывать эту функцию, однако она не заботится о завершении функции.WebAPI Threading

public HttpResponseMessage endPoint 
{ 
    Repository repo= new Repository(); 
    // I want repo.computeLongFunction(); to be called, however this endpoint 
    // can return a http status code "ok" even if the long function hasn't completed. 

    repo.computeLongFunction(); 

    return Request.CreateReponse(HttpStatusCode.Ok); 
} 

// If I make the function async would that work? 
public class Repository 
{ 
    public void compluteLongFunction() 
    { 

    } 
} 
+0

Что произойдет, если метод не удался? Кто-нибудь заботится? –

ответ

4

Используйте параллельную библиотеку задач (TPL), чтобы открутить новый поток.

Task.Run(() => new Repository().computeLongFunction()); 
return Request.CreateReponse(HttpStatusCode.Ok); 
+0

Итак, даже если вызывающая функция заканчивается, порожденный поток будет Продолжать? –

+2

Скручивание новой задачи через Task.Run фактически не создает новую тему. Рабочий элемент computeLongFunction будет запущен, как только ресурсы станут доступными. Итак, это хороший подход, особенно при работе в приложении ASP.NET; лучше не создавать потоки напрямую. – Eniola

+1

Вы должны попытаться создать какой-то механизм, хотя это позволит пользователю заглянуть в состояние завершения запланированной задачи. – Eniola

1

Он не похож на computeLongFunction() возвращает ничего, так что попробуйте это:

Thread longThread = new Thread(() => new Repository().computeLongFunction()); 
longThread.Start(); 

return Request.CreateResponse(HttpStatusCode.Ok); 

Объявить нить так, что вы все равно будете в состоянии контролировать свой жизненный цикл.

+1

Непосредственно взаимодействуя с потоками, в наши дни, как правило, нахмурились - в верхней части потолка в TPL есть несколько хороших абстракций. Есть еще причины напрямую взаимодействовать с потоками, но обычно это относится к категории «только если вы точно знаете, что вы делаете и почему вы это делаете» –