2013-03-15 2 views
0

У меня ситуация, когда масштабируемость имеет первостепенное значение. У меня есть конечная точка API, которая должна позвонить на сторонний веб-сервис, и для завершения может потребоваться более 10 секунд. Я беспокоюсь о том, что веб-запросы сложены на нашем сервере, ожидая завершения запросов сторонних разработчиков. Мне нужно убедиться, что запросы на «StartJob» возвращаются немедленно, и работа фактически выполняется в фоновом режиме. Каков наилучший способ сделать это?Правильный способ сделать асинхронный вызов

// Client polls this endpoint to find out if job is complete 
public ActionResult GetResults(int jobId) 
{ 
    return Content(Job.GetById(jobId)); 
} 

//Client kicks off job with this endpoint 
public ActionResult StartJob() 
{ 
    //Create a new job record 
    var job = new Job(); 
    job.Save(); 

    //start the job on a background thread and let IIS return it's current thread immediately 
    StartJob(); //???? 

    return Content(job.Id); 
} 

//The job consists of calling a 3rd party web service which could take 10+ seconds. 
private void StartJob(long jobId) 
{ 
    var client = new WebClient(); 
    var response = client.downloadString("http://some3rdparty.com/dostuff"); 

    var job = Job.GetById(jobId); 
    job.isComplete = true; 
    job.Save(); 
} 
+0

Обратите внимание, что Задача 4.0, а не 4.5. Какую версию ты используешь? Задачи - это * фантастический инструмент, даже без «ожидания». – Servy

+0

Я использую .NET 4.0 – Micah

+0

«Задача или асинхронное ключевое слово джаз» определенно звучит как хорошее решение - пожалуйста, пересматривайте, если вы можете его использовать. * MEANWHILE * ... что * * вы используете? Каковы наилучшие варианты, которые вы рассматриваете? – paulsm4

ответ

3

Если абонент не заботится о результате вы можете сделать что-то вроде этого:

Task.Factory.StartNew(StartJob(job.Id)); 

Вы также можете использовать эту адаптацию в соответствии с предложением Servy в this comment.

Task.Factory.StartNew(StartJob(job.Id), TaskCreationOptions.LongRunning); 
+2

Потому что вы делаете длинную операцию в потоке пула потоков.Тем не менее, просто придерживайтесь опции «LongRunning», и это решит эту проблему. – Servy

+2

«Лучший способ» довольно субъективен, но это далеко и далеко самый простой способ, который соответствует (предполагаемому) требованию «начать вещь, не блокируя исполнение, не заботясь о том, что происходит с тем, что я начал». –

+2

Вы также можете использовать Task , чтобы получить результат, и .ContinueWith(), чтобы воздействовать на этот результат. –

Смежные вопросы