相关疑难解决方法(0)

ASP.NET MVC Web应用程序中基于队列的后台处理

如何在ASP.NET MVC Web应用程序中实现后台处理队列?虽然大多数数据更改,更新等需要立即可见,但还有其他更新不需要实时处理,我希望将其移交给优先级较低的后台进程,后者将按照自己的进度处理它.

例如,采用StackOverflow的徽章奖励系统.通常,您可以采取特定的行动来奖励您徽章,但实际的"奖励"会在以后发生(通常在10分钟到几个小时之后).我认为这是通过一个单独的后台流程完成的,因为SO的工作在获得时立即授予徽章并不重要.

所以,我正在尝试创建某种队列系统,在这种系统中我可以填充任务(比如任何实现ITask接口的东西,它将有一个Process()方法),最终将由一个单独的进程执行.

我将如何实施这样的系统?想法/提示/示例代码?

谢谢!

c# asp.net-mvc

27
推荐指数
3
解决办法
2万
查看次数

异步HttpWebRequest,无需在Web应用程序中等待

在我的Web应用程序(ASP.NET)中,我有一块代码块,它使用HttpWebRequest来调用REST服务并继续执行.现在,它比我想要完成完整的Web请求需要更长的时间.问题是REST服务返回的内容无用.理想情况下,我想向REST服务发送异步Web请求,然后不等待响应.问题是我已经尝试过使用它了

request.BeginGetResponse(New AsyncCallback(AddressOf myFunc), Nothing)
Run Code Online (Sandbox Code Playgroud)

要启动异步请求而不是等待(我认为这将是异步请求的默认行为),它会在执行下一行代码之后继续执行回调函数BeginGetResponse.

我怀疑ASP.NET可能会在Web应用程序中将其转换为同步请求.我被引导相信这是因为有一个IAsyncResult result对象传递给回调函数,当我检查它的CompletedSynchronously属性时,它总是设置为true.

有没有人知道是否可以在ASP.NET Web应用程序中执行异步HttpWebRequest(没有等待),或者它是否总是转换为同步请求?

asp.net asynchronous httpwebrequest

21
推荐指数
3
解决办法
2万
查看次数

在IHttpAsyncHandler中使用Task或async/await

自从我想要添加线程时编写ASP.NET应用程序以来,我可以通过3种简单的方法在ASP.NET应用程序中完成线程化:

  • 使用System.Threading.ThreadPool.
  • 使用自定义委托并调用其BeginInvoke方法.
  • System.Threading.Thread类的帮助下使用自定义线程.

前两种方法提供了一种快速方法来为您的应用程序启动工作线程.但不幸的是,它们损害了应用程序的整体性能,因为它们使用ASP.NET使用的相同池中的线程来处理HTTP请求.

然后我想使用新的Task或async/await来编写IHttpAsyncHandler.您可以找到的一个例子是Drew Marsh在这里解释的:https://stackoverflow.com/a/6389323/261950

我的猜测是使用Task或async/await仍然消耗来自ASP.NET线程池的线程,我不想要显而易见的原因.

可以告诉我,如果我可以在后台线程上使用Task(async/await),就像使用System.Threading.Thread而不是线程池一样吗?

在此先感谢您的帮助.

托马斯

asp.net ihttpasynchandler threadpool task-parallel-library async-await

15
推荐指数
2
解决办法
9869
查看次数

通过await关键字返回任务与不使用await关键字返回之间的主要区别是什么?

我正在包装AspNet.Identity.但有些事让我对TPL感到困惑.

第一个例子:

    public virtual async Task<IdentityResult> RemovePasswordAsync(string userId)
    {
        var user = _store.FindByIdAsync(userId).Result;
        if (user == null)
            throw new InstanceNotFoundException("user");

        user.PasswordHash = String.Empty;
        user.SecurityStamp = String.Empty;
        return await UpdateAsync(user);
    }

    public virtual async Task<IdentityResult> UpdateAsync(TUser user)
    {
        await _store.UpdateAsync(user);
        return new IdentityResult();
    }
Run Code Online (Sandbox Code Playgroud)

第二个例子:

    public virtual Task<IdentityResult> RemovePasswordAsync(string userId)
    {
        var user = _store.FindByIdAsync(userId).Result;
        if (user == null)
            throw new InstanceNotFoundException("user");

        user.PasswordHash = String.Empty;
        user.SecurityStamp = String.Empty;
        return UpdateAsync(user);
    }

    public virtual async Task<IdentityResult> UpdateAsync(TUser user)
    {
        await _store.UpdateAsync(user);
        return …
Run Code Online (Sandbox Code Playgroud)

c# asp.net multithreading task-parallel-library

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

启动异步线程的当前和推荐方法是什么?

我有一个ASP.NET MVC 3(.NET 4)Web应用程序.

我有一个[HttpPost]动作方法,它将一些数据提交给数据库.

现在,在这个方法完成持久到存储库后,我希望执行"后台"任务(想想审计,或发送电子邮件等),我不关心结果(除非发生错误,其中我将执行日志记录).

我怎么能/应该从我的行动方法中解雇这个任务?

[HttpPost]
[Authorize]
public ActionResult Create(MyViewModel model)
{
   if (ModelState.IsValid)
   {
      _repo.Save(model); 
      // TODO: Fire off thread
      return RedirectToRoute("Somepage", new { id = model.id });
   }
   return View(model);
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading .net-4.0 threadpool asp.net-mvc-3

6
推荐指数
1
解决办法
1924
查看次数

ThreadPools与自己的线程,用于长时间运行的进程

我们有一些长期运行的业务流程,这些流程是通过在WS 2008 R2上以IIS(集成模式)运行的WCF服务启动的.这些业务流程通常涉及与SQL Server后端的大量交互.我们创建了一个自定义任务队列实现,通过初始服务调用将请求排队,然后根据优先级执行.此执行可能需要很长时间才能完成(极端20-30分钟).然后,客户端可以向服务器查询其自己的后台任务的进度.

在我们当前的实现中,任务在一个单独的线程上触发,而不是从ThreadPool执行.这是因为阅读了使用ThreadPool不运行长时间运行任务的建议,以防止使ASP.NET请求无法提供服务.我们通过对可以同时执行的后台任务的数量设置上限来控制生成的线程数.这样我们就可以尝试控制CPU上的负载并防止过多的线程上下文切换.虽然所有这一切都在发生,但我们当然仍然需要为应用程序提供正常的"在线"请求.

在阅读了Thomas Marquardt撰写的这篇文章后,我担心我们没有使用ThreadPool,因为我们无法获得内置调优启发式的好处.我们已经通过挂钩ApplicationEnd事件并取消长时间运行的任务来解决关闭问题.所以我的问题是,我们应该切换到使用ThreadPool吗?这些线程被长时间捆绑了怎么办?如果我正确理解Thomas,他说这无关紧要,因为ThreadPool会调整自己以创建更多请求以服务于正常的在线操作?我也读过这个覆盖相同理由的StackOverflow问题,但我仍然不确定前进的方向.

asp.net iis-7 threadpool

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

如何从MVC创建一个长时间运行的后台任务

我在VS 2013中使用EF6,MVC 5.我有一个长时间运行的任务导致超时错误,因此我想将其设置为单独的后台任务运行并立即返回到Web控制器.后台任务将向SQL服务器数据库报告进度.基本上,我需要的是消防功能.似乎有很多选择:

  1. 将任务详细信息写入服务器并使用Windows服务处理它们UPDATE:这是使用的选项
  2. 使用async- 这似乎不是一个安全的选择
  3. 使用HostingEnvironment.QueueBackgroundWorkItem方法

选项3将是首选,因为它将所有代码保存在一个解决方案中.如果可能的话,请你评论每一个的利弊,并指出3号工作的例子.

c# asp.net-mvc multithreading entity-framework async-await

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

使用AsyncController帮助增加旧版ASP.NET MVC 3项目的并发性

我们现在有一个与并发用户斗争的网站.

以下是该项目的高级背景:

  • 旧版ASP.NET MVC 3项目(.NET 4)
  • 无法对核心代码进行任何重大改写
  • 占用时间最长的主要入口点是控制器SubmitSearch上的操作Search.平均响应时间为5-10秒.

因此,如第二点所述,我们不希望在此项目上花费太多时间来重写大部分内容.但是,我们希望尝试增加并发用户.我们不打算改变其他任何东西或提高性能,因为它需要更多的工作.

我们看到的是,随着越来越多的人受到打击SubmitSearch,网站总体上变慢了.这很可能是由于所有IIS线程被锁定执行搜索.

我们正在寻求实现AsyncControllerSubmitSearch在正常的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)

asp.net-mvc multithreading asynccontroller

0
推荐指数
1
解决办法
610
查看次数