我正在尝试学习如何在MVC2中使用AsyncController,但是那里的文档/教程很少.我正在寻找一种普通的控制器方法,它对第三方服务的导出非常慢,并将其转换为异步方法.
原始控制器方法:
public JsonResult SaveSalesInvoice(SalesInvoice invoice)
{
SaveInvoiceToDatabase(invoice); // this is very quick
ExportTo3rdParty(invoice); // this is very slow and should be async
}
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个继承自AsyncController的新控制器:
public class BackgroundController : AsyncController
{
public void ExportAysnc(int id)
{
SalesInvoice invoice = _salesService.GetById(id);
ExportTo3rdParty(invoice);
}
public void ExportCompleted(int id)
{
// I dont care about the return value right now,
// because the ExportTo3rdParty() method
// logs the result to a table
}
public void Hello(int id)
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后从jQuery调用Export方法:
function Export() …Run Code Online (Sandbox Code Playgroud) 我正在尝试将此方法转换ExportTo3rdParty()为使用AsyncController:
public JsonResult SaveSalesInvoice(SalesInvoice invoice)
{
SaveInvoiceToDatabase(invoice); // this is very quick
ExportTo3rdParty(invoice); // this is very slow and should be async
}
Run Code Online (Sandbox Code Playgroud)
但是ExportTo3rdParty()方法在多个地方使用HttpContext.Current(太多不能改变 - 原始编码器没有使用足够的依赖注入).例如,它调用GetDefaultCurrency().当通过AsyncController调用ExportTo3rdParty()时,这仍然有用吗?
public Currency GetDefaultCurrency()
{
Currency currency;
string key = string.Format("DefaultCurrency_{0}",
HttpContext.Current.User.Identity.Name);
currency = HttpRuntime.Cache.Get(key) as Currency;
if (currency == null)
{
currency = LookupDefaultCurrency();
HttpRuntime.Cache[key] = currency;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我使用Thread.Start,我无法访问HttpContext.Current.但是AsyncController怎么样?
可以在一个中使用异步和同步动作方法AsyncController吗?这样做有什么缺点吗?
原因是异步操作对于耗时的操作有意义,但是在HTML中返回表单没有意义.
例如,我有一个生成文件的页面.返回带有输入的表单的操作方法几乎没有逻辑,但是接收POST,将其发送到另一个Web服务并中继响应的操作方法需要一些时间,因此异步执行它是有意义的.
我可以将这些方法放在分离的控制器中,一个是同步的,另一个是同步的,但我想把它们放在一起.
干杯.
为了提高MVC3应用程序的性能,我们希望将一些Controller标记为AsyncController.我们使用EF 4.x(最新的稳定版),需要一些建议,链接如何以适当的方式对EF进行异步调用.如何处置实体等
如果它可能,并且有意义.谢谢.
asynchronous asynccontroller entity-framework-4.1 asp.net-mvc-3
我刚刚将我的控制器转换为asp.net mvc 2中的asyncController.(即:分割动作方法关于AboutAsync和AboutCompleted).但是,我收到资源未找到错误.
我的路线表没有变化,我能想到的唯一原因是因为我是mvcextension项目.既然它是自己的controllerFactory接线并从IoC容器创建实例,它是否需要连接AsyncHttpHandler呢?任何人都可以放弃一些提示吗?
提前致谢.
Asp.net 2默认有12个线程
现在Asp.Net 4有5000.我们还需要异步控制器吗?
我正在尝试将一些方法转换为异步,并从我正在修改的控制器中的一个简单示例开始:
public class MyAPIController : AsyncController
{
public async Task<JsonResult> List()
{
return Json(123456, JsonRequestBehavior.AllowGet);
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我测试方法而不是Json结果时,我得到字符串值"System.Threading.Tasks.Task`1 [System.Web.Mvc.JsonResult]",我已经通过Fiddler和浏览验证了这一点.
该项目已手动升级到.NET45.搜索表明这可能是组件版本不正确的问题,但检查项目文件和Process视图表明在运行时引用和加载了正确的类型.
有人有任何调试技巧吗?
谢谢.
我们现在有一个与并发用户斗争的网站.
以下是该项目的高级背景:
SubmitSearch上的操作Search.平均响应时间为5-10秒.因此,如第二点所述,我们不希望在此项目上花费太多时间来重写大部分内容.但是,我们希望尝试增加并发用户.我们不打算改变其他任何东西或提高性能,因为它需要更多的工作.
我们看到的是,随着越来越多的人受到打击SubmitSearch,网站总体上变慢了.这很可能是由于所有IIS线程被锁定执行搜索.
我们正在寻求实现AsyncController并SubmitSearch在正常的CLR线程上执行操作.以下是我们想要实现它的方式:
假设这是原始SubmitSearch方法:
/// <summary>
/// Submits a search for execution.
/// </summary>
/// <param name="searchData">The search data</param>
/// <returns></returns>
public virtual ActionResult SubmitSearch(SearchFormModel searchData)
{
//our search code
}
Run Code Online (Sandbox Code Playgroud)
我们希望转换为最快的方法AsyncController是简单地执行此操作:
/// <summary>
/// Submits a search for execution.
/// </summary>
/// <param name="searchData">The search data</param>
/// <returns></returns>
protected virtual ActionResult SubmitSearch(SearchFormModel searchData)
{
//our search code …Run Code Online (Sandbox Code Playgroud)