标签: asynccontroller

ApiController的异步方法 - 有什么好处?什么时候用?

(这可能与ASP.NET MVC4异步控制器问题重复- 为什么要使用?,但关于webapi,我不同意那里的答案)

假设我有一个长时间运行的SQL请求.它的数据应序列化为JSON并发送到浏览器(作为xhr请求的响应).示例代码:

public class DataController : ApiController
{
    public Task<Data> Get()
    {
        return LoadDataAsync(); // Load data asynchronously?
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行$ .getJson('api/data',...)时会发生什么(请参阅此海报http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster. pdf):

  1. [IIS] IIS接受请求.
  2. [IIS] IIS等待来自托管池的一个线程[THREAD](http://msdn.microsoft.com/en-us/library/0ka9477y ( v=vs.110 ) .aspx)并开始工作.
  3. [THREAD] Webapi在该线程和其他类中创建新的DataController对象.
  4. [THREAD]使用任务并行lib在[THREAD2]中启动sql-query
  5. [THREAD]返回托管池,准备进行其他处理
  6. [THREAD2]与sql驱动程序一起工作,准备好读取数据并调用[THREAD3]来回复xhr请求
  7. [THREAD3]发送响应.

如果出现问题,请随时纠正我.

在上面的问题中,他们说,点和利润是,[THREAD2]不是来自托管池,但MSDN文章(上面的链接)说

默认情况下,并行库类型类似TaskTask<TResult>使用线程池线程来运行任务.

所以我得出结论,所有三个线程都来自托管池.

此外,如果我使用同步方法,我仍然只使用一个线程(来自宝贵的线程池)保持我的服务器响应.

那么,从1个线程交换到3个线程的实际意义是什么?为什么不在线程池中最大化线程?

有没有明显有用的方法来使用异步控制器?

task-parallel-library asynccontroller async-await asp.net-web-api

25
推荐指数
1
解决办法
2万
查看次数

使用ASP.NET MVC 2 AsyncController实现长时间运行任务的进度条

在阅读ASP.NET MVC 2中的AsyncControllers文档之后,我想知道在这种情况下实现ajax进度条的最佳方法是什么.这个教程根本没有涵盖这一点似乎有点奇怪.

我想实现一个AJAX进度条涉及需要额外的操作方法来返回当前任务的状态.但是,我不确定在工作线程和该操作方法之间交换有关任务状态的信息的最佳方法.

到目前为止,我最好的想法是将有关当前进度的信息与唯一的ID一起放入会话字典中,并与客户端共享该ID,以便它可以轮询状态.但也许有一种我没有注意到的更简单的方法.

最好的方法是什么?

谢谢,

阿德里安

ajax asp.net-mvc asynccontroller asp.net-mvc-2

15
推荐指数
1
解决办法
7292
查看次数

构建MVC2 AsyncControllers的单元测试

我正在考虑重新编写一些我的MVC控制器作为异步控制器.我有这些控制器的工作单元测试,但我试图了解如何在异步控制器环境中维护它们.

例如,目前我有这样的动作:

public ContentResult Transaction()
{
    do stuff...
    return Content("result");
}
Run Code Online (Sandbox Code Playgroud)

我的单元测试基本上看起来像:

var result = controller.Transaction();
Assert.AreEqual("result", result.Content);
Run Code Online (Sandbox Code Playgroud)

好的,这很容易.

但是,当您的控制器更改为如下所示:

public void TransactionAsync()
{
    do stuff...
    AsyncManager.Parameters["result"] = "result";
}

public ContentResult TransactionCompleted(string result)
{
    return Content(result);
}
Run Code Online (Sandbox Code Playgroud)

您如何构建单元测试?您当然可以在测试方法中调用异步启动器方法,但是如何获得返回值?

我在Google上没有看到任何相关内容......

谢谢你的任何想法.

asynccontroller asp.net-mvc-2

10
推荐指数
1
解决办法
1429
查看次数

使用tomcat和spring处理异步http请求

这是我的第一个问题所以请耐心等待我:)

我正在尝试创建一个服务:

  1. 接收包含要查询的URL的HTTP GET请求
  2. 对于单个GET请求,服务将提取URL
  3. 查询有关URL的本地数据库
  4. 如果在DB中找到了结果,它会将其返回给客户端,如果没有,则需要查询一些外部服务(可能需要相对较长的时间才能响应)
  5. 将URL的结果返回给客户端

我在虚拟机和Tomcat7上使用spring运行它.我会事先道歉并提到我对Tomcat很新

无论如何,我期待很多并发GET请求到这个服务(成千上万的同时请求)我基本上想要实现的是尽可能地使这个服务可扩展(如果这是不可能的那么至少一个可以处理数十万个并发请求的服务)

我一直在阅读A LOT关于服务中的异步请求处理,特别是在Tomcat中,但我有些事情对我来说仍然不清楚:

  1. 从官方tomcat网站看来,Tomcat似乎包含许多接受者线程和工作线程数.如果是这样,我为什么要使用AsyncContext?什么是释放Tomcat的工作线程并在我的应用程序中占用不同的线程以执行完全相同的操作的好处?(系统中仍有1个活动线程)
  2. 有点类似于第一个问题,但创建AsyncContext并将其与不同的线程一起使用有什么好处?(来自我的应用程序中创建的线程池的线程)
  3. 关于同样的问题,我在这里看到我也可以返回一个Callable或DeferredResult,并用Tomcat的一个线程或我自己的一个线程处理它.返回Callable或使用DeferredResult而不仅仅是处理来自请求的AsyncContext有什么好处吗?
  4. 另外,如果我决定返回一个可调用的,Tomcat从哪个线程池获取线程来处理我的callable?这里使用的线程是否与我之前提到的Tomcat相同的工作线程?如果是这样,我发布一个Tomcat工作线程并使用另一个工作线程可以获得哪些好处?
  5. 我从Oracle的文档中看到,我可以向AsyncContext传递一个将同时处理的Runnable对象,用于执行此Runnable的线程来自何处?我有控制权吗?另外,将AsyncContext传递给Runnable而不仅仅是将AsyncContext传递给我的一个线程有什么好处?

我为同样的问题提出了很多问题而道歉,但是我和我的同事们争论这些事情一个多星期没有任何具体的答案.

我还有一个更普遍的问题:您认为使我描述的服务具有可扩展性的最佳方法是什么?(暂时不要添加更多机器),您是否可以针对目标解决方案发布任何示例或参考?

我发布了更多我一直在关注的链接链接,但我目前的声誉不允许.我将非常感谢任何可以理解的参考文献或具体的例子,我很乐意澄清任何相关问题

干杯!

java multithreading tomcat spring-mvc asynccontroller

8
推荐指数
1
解决办法
1598
查看次数

ASP.NET MVC 2具有超时的异步操作

我想在ASP.NET MVC 2中编写一个异步操作,等待最多5秒钟才能发生事件.如果事件发生,则服务器响应结果,否则请求超时.

实现这一目标的最佳方法是什么?

c# asp.net-mvc asynchronous asynccontroller

5
推荐指数
1
解决办法
2738
查看次数

ASP.NET MVC AsyncController xxxCompleted

实现ASP.NET MVC AsyncController时,xxxCompleted方法必须是Public.我想知道这是否意味着可以直接调用xxxCompleted方法,或者如果使用NonAction或类似内部保护它?

谢谢.

asp.net asp.net-mvc asynccontroller

5
推荐指数
1
解决办法
475
查看次数

ASP.NET MVC的AsyncController可用于服务大量并发挂起请求(长轮询)吗?

Node.js,Tornado和Twisted等框架允许开发人员创建支持大量并发挂起请求(10k +)的服务器推送应用程序.据我所知,他们都是通过不创建线程来为每个挂起请求提供服务来实现这一点.

AsyncController可用于服务大量非活动并发请求吗?

如果是这样,是否有任何相当大的ASP.NET MVC网站使用这种方法来创建长轮询应用程序?

asp.net asp.net-mvc server-push long-polling asynccontroller

5
推荐指数
2
解决办法
3344
查看次数

AsyncController如何避免使用ASP.NET工作线程?

究竟如何AsyncController避免使用ASP.NET工作线程?如果我使用基于事件的模式(伪代码):

[AsyncTimeout(60000)]
public void WaitForWakeUp() 
{
    AsyncManager.OutstandingOperations.Increase();
    EventRaisedElsewhere += 
    state => 
    {
        AsyncManager.OutstandingOperations.Decrease();
        return Content("Woke up because of " + state);
    };
}
Run Code Online (Sandbox Code Playgroud)

...然后根据Clay Lenharts,它不使用ASP.NET工作线程.这怎么可能?

我看了一下AsyncController源代码,但没有理解任何东西,除了它使用IAsyncResult很多,并QueueUserWorkItem在某些地方.

但如何能BeginInvokeQueueUserWorkItem 不能使用ASP.NET工作者线程?当然这两个都使用线程池线程,并且ASP.NET工作进程中肯定只有一个线程池?

根据MSDN,

Web服务器从线程池(工作线程)获取一个线程,并调度它来处理传入的请求.此工作线程启动异步操作.

工作线程返回到线程池以服务另一个Web请求.

异步操作完成后,它会通知ASP.NET.

但是对于任何非平凡的事情,听起来像启动一个异步操作仍然需要一个线程来运行.只有在极其简单的情况下(比如使用BCL下载网页内容),它才能完全展开和/或完全受IOCP约束,对吧?

我问的部分是因为我看到所有这些聊天服务器都是使用实现的AsyncController,如果所有这些都是"等待新消息",我不明白如何在非线程池线程上完成.

asp.net-mvc threadpool asynccontroller

5
推荐指数
1
解决办法
586
查看次数

AsyncController OutputCache

在ASP.NET MVC中实现异步控制器操作时,如果我想输出缓存ActionResult,我将该OutputCache属性放在哪个方法上?

public class PortalController : AsyncController {
    /// HERE...?
    [OutputCache(Duration = 60 * 30 /* 30min */, VaryByParam = "city")]
    public void NewsAsync(string city) {

        AsyncManager.OutstandingOperations.Increment();
        NewsService newsService = new NewsService();
        newsService.GetHeadlinesCompleted += (sender, e) =>
        {
            AsyncManager.Parameters["headlines"] = e.Value;
            AsyncManager.OutstandingOperations.Decrement();
        };
        newsService.GetHeadlinesAsync(city);
    }

    /// ...OR HERE?
    [OutputCache(Duration = 60 * 30 /* 30min */, VaryByParam = "city")]
    public ActionResult NewsCompleted(string[] headlines) {
        return View("News", new ViewStringModel
        {
            NewsHeadlines = headlines
        });
    } …
Run Code Online (Sandbox Code Playgroud)

outputcache asynccontroller asp.net-mvc-3

3
推荐指数
1
解决办法
1195
查看次数

ASP.Net MVC AsyncController 日志请求处理时间

我需要获取 asp.net MVC 的请求处理时间。我使用 IHttpModule 订阅 onBeginRequest 和 onEndRequest 事件。对于同步控制器,它工作得很好,但对于异步,它返回错误的结果(例如,当实时时间约为 2 分钟时为 20 毫秒)。如何以一般方式获得 AsyncController 的请求处理时间(不在 ActionAsync/ActionCompleted 中为每个异步操作编写附加代码)?

public class TrackRequestModule : RequestProcessingModuleBase, IHttpModule
{
    public const string BeginRequestTimeKey = "beginRequestTime";

    public void Init(HttpApplication context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        context.BeginRequest += onBeginRequest;
        context.EndRequest += onEndRequest;
    }

    private void onEndRequest(object sender, EventArgs e)
    {
        InvokeHandler(sender, OnEndRequest);
    }

    private void onBeginRequest(object sender, EventArgs e)
    {
        InvokeHandler(sender, OnBeginRequest);
    }

    public void OnBeginRequest(HttpContextBase context)
    {
        context.Items[BeginRequestTimeKey] = DateTime.Now.ToLocalTime(); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net ihttpmodule asynccontroller asp.net-mvc-3

3
推荐指数
1
解决办法
1480
查看次数