Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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# ASP.NET MVC Web API应用程序中的长阻塞while循环_C#_Asp.net Mvc_Asp.net Web Api_Async Await - Fatal编程技术网

C# ASP.NET MVC Web API应用程序中的长阻塞while循环

C# ASP.NET MVC Web API应用程序中的长阻塞while循环,c#,asp.net-mvc,asp.net-web-api,async-await,C#,Asp.net Mvc,Asp.net Web Api,Async Await,第三方产品供应商给了我一个任务的Perl脚本实现。我的工作是将其转换为ASP.NET MVC5 web应用程序 perl脚本的一个组件是while循环,其中包含以下内容: ### Only run this task every second, that's plenty sleep 1; 基本上,他们是以1秒的间隔在while循环中做事情(伪代码): 通常需要20-30次尝试(20-30秒)才能找到东西 这是使用async和await进行异步编程的目的,还是web应用程序中不

第三方产品供应商给了我一个任务的Perl脚本实现。我的工作是将其转换为ASP.NET MVC5 web应用程序

perl脚本的一个组件是while循环,其中包含以下内容:

    ### Only run this task every second, that's plenty
    sleep 1;
基本上,他们是以1秒的间隔在while循环中做事情(伪代码):

通常需要20-30次尝试(20-30秒)才能找到东西

这是使用async和await进行异步编程的目的,还是web应用程序中不应该有这种功能


该过程将通过对webapi的ajax调用公开。如果可行,是否有人能提供一些伪代码,说明它如何在不阻塞应用程序的情况下工作?

您可以使用async/await,但这更多是关于同步异步行为的。你的问题有点不同,你有一个长时间运行的过程,你不能阻止它,所以你需要一种方法来触发它开始,提供更新,然后处理完成。你可以用信号器来做这个

如果您想使用ajax来实现这一点,那么类似于API的东西

StartJob()    -> return GUID
JobStatus(guid)   ->  either, InProgress ( % complete if you can), Final Result, or Error
然后客户端,启动它,然后轮询状态直到完成

在实现方面,您只需启动任务并将其存储在与GUID关联的缓存中


如果你想买一条漂亮的裤子,你可以用微软的奥尔良或者Akka来做处理。

你可以用async/await,但这更多的是关于同步异步行为的。你的问题有点不同,你有一个长时间运行的过程,你不能阻止它,所以你需要一种方法来触发它开始,提供更新,然后处理完成。你可以用信号器来做这个

如果您想使用ajax来实现这一点,那么类似于API的东西

StartJob()    -> return GUID
JobStatus(guid)   ->  either, InProgress ( % complete if you can), Final Result, or Error
然后客户端,启动它,然后轮询状态直到完成

在实现方面,您只需启动任务并将其存储在与GUID关联的缓存中

如果你想买一条漂亮的裤子,你可以用微软的奥尔良或者Akka来处理

如果可行的话,有人能提供一些伪代码来说明它如何在不阻塞应用程序的情况下工作吗

AJAX调用总是非阻塞的。在服务器端,您无需为此执行任何特殊操作

我建议您使用
async
/
await
,这样您就不会使用ASP.NET线程睡眠:

public async Task<MyResult> GetThing()
{
  While (condition)
  {
    -go get an m3u8 playlist file from the web
    -parse it line by line
    -look for a particular thing in it
    -If you find it, break out of this loop and do stuff with it
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}
public异步任务GetThing()
{
While(条件)
{
-从web获取m3u8播放列表文件
-逐行解析它
-在里面寻找一个特别的东西
-如果你找到它,打破这个循环,用它做一些事情
等待任务延迟(时间跨度从秒(1));
}
}
但请注意,
async
仅用于释放ASP.NET服务器端的线程。这对客户没有任何影响。客户机进行AJAX调用,并异步处理完成,而不考虑服务器的实现

如果可行的话,有人能提供一些伪代码来说明它如何在不阻塞应用程序的情况下工作吗

AJAX调用总是非阻塞的。在服务器端,您无需为此执行任何特殊操作

我建议您使用
async
/
await
,这样您就不会使用ASP.NET线程睡眠:

public async Task<MyResult> GetThing()
{
  While (condition)
  {
    -go get an m3u8 playlist file from the web
    -parse it line by line
    -look for a particular thing in it
    -If you find it, break out of this loop and do stuff with it
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}
public异步任务GetThing()
{
While(条件)
{
-从web获取m3u8播放列表文件
-逐行解析它
-在里面寻找一个特别的东西
-如果你找到它,打破这个循环,用它做一些事情
等待任务延迟(时间跨度从秒(1));
}
}

但请注意,
async
仅用于释放ASP.NET服务器端的线程。这对客户没有任何影响。客户端进行AJAX调用,并异步处理完成,而不考虑服务器的实现。

通过“使用它做一些事情”,您的意思是用户将看到,还是它只是更新后端或其他东西?只是后端。实际上,只要把东西放到数据库里就行了。没有数据返回到浏览器。稍后,该内容将从数据库中调用并在另一个进程中使用。所谓“使用它进行操作”,您的意思是用户将看到,还是它只是更新后端或其他内容?只是后端。实际上,只要把东西放到数据库里就行了。没有数据返回到浏览器。稍后,将从数据库中调用该对象,并在另一个进程中使用。