Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进行异步调用的正确方法_C#_.net_Asp.net Mvc_Asynchronous - Fatal编程技术网

C# 进行异步调用的正确方法

C# 进行异步调用的正确方法,c#,.net,asp.net-mvc,asynchronous,C#,.net,Asp.net Mvc,Asynchronous,在我的情况下,可伸缩性是最重要的。我有一个API端点,它必须调用第三方web服务,并且可能需要10秒钟才能完成。我所关心的是web请求在等待第三方请求完成时堆积在我们的服务器上。我需要确保对“StartJob”的请求立即返回,并且作业实际上在后台运行。最好的方法是什么 // Client polls this endpoint to find out if job is complete public ActionResult GetResults(int jobId) { return

在我的情况下,可伸缩性是最重要的。我有一个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));
您也可以按照Servy在中的建议使用此改编


请注意,任务是4.0,而不是4.5。你用的是什么版本?任务是一个很棒的工具,即使没有
wait
。“任务或异步关键字jazz”听起来绝对是一个不错的解决方案-请重新考虑是否可以使用它。同时。。。你在用什么?您正在考虑的最佳选项是什么?@Micah这样您就可以使用任务,而不是
wait
“我正在使用.Net 4.0”。酷-那么异步任务是您的一个选项:)@迈卡,真的吗?你不知道问题的性质?它非常模糊;你所问的问题没有真正明确的定义。就需求而言,“使我的代码异步化”是不够的。其次,您几乎只是陈述了您的(非常差的)需求并要求解决方案。它没有显示任何研究,也没有试图自己解决它,在更大的问题背景下没有更具体的问题,等等。我希望有人花了和你一样多的时间来实现这一点。请注意,任务是4.0,而不是4.5。你用的是什么版本?任务是一个很棒的工具,即使没有
wait
。“任务或异步关键字jazz”听起来绝对是一个不错的解决方案-请重新考虑是否可以使用它。同时。。。你在用什么?您正在考虑的最佳选项是什么?@Micah这样您就可以使用任务,而不是
wait
“我正在使用.Net 4.0”。酷-那么异步任务是您的一个选项:)@迈卡,真的吗?你不知道问题的性质?它非常模糊;你所问的问题没有真正明确的定义。就需求而言,“使我的代码异步化”是不够的。其次,您几乎只是陈述了您的(非常差的)需求并要求解决方案。它没有显示任何研究,也没有试图自己解决它,在更大的问题的上下文中没有更具体的问题,等等。我希望像您这样花了大量时间的人能够意识到这一点。因为您正在线程池线程中执行长时间运行的操作。也就是说,只要加上一个
长时间运行
选项,就可以解决这个问题。“最佳方法”是非常主观的,但这绝对是满足(假设的)要求的最简单的方法,即“启动一件事情而不阻止执行,而不关心我启动的事情会发生什么。”您还可以使用任务来获得结果,和.ContinueWith()对该结果进行操作。因为您正在线程池线程中执行一个长时间运行的操作。也就是说,只要加上一个
长时间运行
选项,就可以解决这个问题。“最佳方法”是非常主观的,但这绝对是满足(假设的)要求的最简单的方法,即“启动一件事情而不阻止执行,而不关心我启动的事情会发生什么。”您还可以使用任务来获得结果,和.ContinueWith()对该结果执行操作。