(这可能与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):
如果出现问题,请随时纠正我.
在上面的问题中,他们说,点和利润是,[THREAD2]不是来自托管池,但MSDN文章(上面的链接)说
默认情况下,并行库类型类似
Task并Task<TResult>使用线程池线程来运行任务.
所以我得出结论,所有三个线程都来自托管池.
此外,如果我使用同步方法,我仍然只使用一个线程(来自宝贵的线程池)保持我的服务器响应.
那么,从1个线程交换到3个线程的实际意义是什么?为什么不在线程池中最大化线程?
有没有明显有用的方法来使用异步控制器?
task-parallel-library asynccontroller async-await asp.net-web-api
在阅读ASP.NET MVC 2中的AsyncControllers文档之后,我想知道在这种情况下实现ajax进度条的最佳方法是什么.这个教程根本没有涵盖这一点似乎有点奇怪.
我想实现一个AJAX进度条涉及需要额外的操作方法来返回当前任务的状态.但是,我不确定在工作线程和该操作方法之间交换有关任务状态的信息的最佳方法.
到目前为止,我最好的想法是将有关当前进度的信息与唯一的ID一起放入会话字典中,并与客户端共享该ID,以便它可以轮询状态.但也许有一种我没有注意到的更简单的方法.
最好的方法是什么?
谢谢,
阿德里安
我正在考虑重新编写一些我的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上没有看到任何相关内容......
谢谢你的任何想法.
这是我的第一个问题所以请耐心等待我:)
我正在尝试创建一个服务:
我在虚拟机和Tomcat7上使用spring运行它.我会事先道歉并提到我对Tomcat很新
无论如何,我期待很多并发GET请求到这个服务(成千上万的同时请求)我基本上想要实现的是尽可能地使这个服务可扩展(如果这是不可能的那么至少一个可以处理数十万个并发请求的服务)
我一直在阅读A LOT关于服务中的异步请求处理,特别是在Tomcat中,但我有些事情对我来说仍然不清楚:
我为同样的问题提出了很多问题而道歉,但是我和我的同事们争论这些事情一个多星期没有任何具体的答案.
我还有一个更普遍的问题:您认为使我描述的服务具有可扩展性的最佳方法是什么?(暂时不要添加更多机器),您是否可以针对目标解决方案发布任何示例或参考?
我发布了更多我一直在关注的链接链接,但我目前的声誉不允许.我将非常感谢任何可以理解的参考文献或具体的例子,我很乐意澄清任何相关问题
干杯!
我想在ASP.NET MVC 2中编写一个异步操作,等待最多5秒钟才能发生事件.如果事件发生,则服务器响应结果,否则请求超时.
实现这一目标的最佳方法是什么?
实现ASP.NET MVC AsyncController时,xxxCompleted方法必须是Public.我想知道这是否意味着可以直接调用xxxCompleted方法,或者如果使用NonAction或类似内部保护它?
谢谢.
Node.js,Tornado和Twisted等框架允许开发人员创建支持大量并发挂起请求(10k +)的服务器推送应用程序.据我所知,他们都是通过不创建线程来为每个挂起请求提供服务来实现这一点.
AsyncController可用于服务大量非活动并发请求吗?
如果是这样,是否有任何相当大的ASP.NET MVC网站使用这种方法来创建长轮询应用程序?
asp.net asp.net-mvc server-push long-polling asynccontroller
究竟如何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在某些地方.
但如何能BeginInvoke和QueueUserWorkItem 不能使用ASP.NET工作者线程?当然这两个都使用线程池线程,并且ASP.NET工作进程中肯定只有一个线程池?
根据MSDN,
Web服务器从线程池(工作线程)获取一个线程,并调度它来处理传入的请求.此工作线程启动异步操作.
工作线程返回到线程池以服务另一个Web请求.
异步操作完成后,它会通知ASP.NET.
但是对于任何非平凡的事情,听起来像启动一个异步操作仍然需要一个线程来运行.只有在极其简单的情况下(比如使用BCL下载网页内容),它才能完全展开和/或完全受IOCP约束,对吧?
我问的部分是因为我看到所有这些聊天服务器都是使用实现的AsyncController,如果所有这些都是"等待新消息",我不明白如何在非线程池线程上完成.
在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) 我需要获取 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) asynccontroller ×10
asp.net-mvc ×5
asp.net ×3
c# ×2
ajax ×1
async-await ×1
asynchronous ×1
ihttpmodule ×1
java ×1
long-polling ×1
outputcache ×1
server-push ×1
spring-mvc ×1
threadpool ×1
tomcat ×1