进行异步调用的正确方法

本文关键字:方法 调用 异步 | 更新日期: 2023-09-27 18:04:23

我有一个情况,可伸缩性是最重要的。我有一个API端点,它必须调用第三方web服务,它可能需要超过10秒才能完成。我担心的是,在等待第三方请求完成时,web请求会堆积在我们的服务器上。我需要确保对"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();
}

进行异步调用的正确方法

如果调用者不关心结果,你可以这样做:

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

你也可以像Servy在评论中建议的那样使用这个改编。

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