相关疑难解决方法(0)

在高流量场景中使用ASP.NET中的ThreadPool.QueueUserWorkItem

我一直认为使用ThreadPool(比如说非关键的)短期背景任务被认为是最佳实践,即使在ASP.NET中也是如此,但后来我发现这篇文章似乎暗示了其他 -这个论点是你应该离开ThreadPool来处理ASP.NET相关的请求.

所以这就是我到目前为止一直在做的小异步任务:

ThreadPool.QueueUserWorkItem(s => PostLog(logEvent))
Run Code Online (Sandbox Code Playgroud)

而且文章建议明确地创建一个线程,类似于:

new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start()
Run Code Online (Sandbox Code Playgroud)

第一种方法具有管理和限制的优点,但是有可能(如果文章是正确的)后台任务正在争夺具有ASP.NET请求处理程序的线程.第二种方法释放了ThreadPool,但代价是无限制,因此可能耗尽太多资源.

所以我的问题是,文章中的建议是否正确?

如果你的网站流量太大而你的ThreadPool已经满了,那么最好是带外,还是一个完整的ThreadPool意味着你无论如何都要达到你的资源限制,在这种情况下你不应该试图开始自己的线程?

澄清:我只是询问小型非关键异步任务(例如,远程日志记录)的范围,而不是需要单独过程的昂贵工作项(在这些情况下,我同意您需要更强大的解决方案).

asp.net multithreading threadpool

109
推荐指数
2
解决办法
4万
查看次数

WebAPI中的长时间运行任务

这是我的问题:我需要在ApiController中调用多个第三方方法.这些方法的签名是Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData).在ApiController将数据发送回客户端后,我希望这些调用继续在后台运行.当DoSomethingAsync完成我想要做一些记录,也许一些数据保存到文件系统.我怎样才能做到这一点?我更喜欢使用asyny/await语法.

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

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

长时间运行的任务 - 最佳实践 - ASP.NET 4.0,C#

处理需要很长时间才能执行的流程的推荐方法是什么?我不想简单地在服务器上运行它,因为页面会超时.

我浏览了网页,发现了多种方法--AJAX,线程,Web服务......(我没有经验)

处理这个问题的最佳实践方法是什么?

谢谢.

c# asp.net ajax web-services

7
推荐指数
2
解决办法
3880
查看次数

ASP.NET长时间运行的任务.线程正在中止异常

ASP.NET 3.5 webapp必须启动几个需要几个小时才能完成的任务.出于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有任何人想要等待那么长时间才能获得响应,因此任务必须是异步的.

有一个Helper类来处理所有这些长时间运行的任务.计划和执行这些任务的主要方法目前如下:

public static bool ScheduleTask(TaskDescriptor task, Action action)
{
    bool notAlreadyRunning = TasksAsync.TryAdd(task);
    if (notAlreadyRunning)
    {
        Thread worker = null;
        worker = new Thread(() => 
        {
            try { action(); }
            catch(Exception e)
            {
                Log.LogException(e, "Worker");
            }
            TasksAsync.RemoveTask(task);
            workers.Remove(worker);
        });
        workers.Add(worker);
        worker.Start();
    }
    return notAlreadyRunning;
}
Run Code Online (Sandbox Code Playgroud)

在早期的实现中,我们使用了这种ThreadPool.QueueUserWorkItem方法,但结果总是相同的:在aprox之后.20-30分钟一个线程被中止异常被抛出.

有谁知道为什么会这样?或者如何预防?

更多信息:

  • IIS标准配置.
  • 任务可以是任何内容,查询数据库和/或IO操作等.

更新:决定

谢谢大家的回复.现在我不知道哪个问题要标记为答案.所有这些都是有效的,并且可以解决这个问题.将等待今天并以最高票数回答答案,如果是平局,我将选择第一个显示的答案,通常它们按最相关的顺序排序.

对于任何想要知道我选择的解决方案的人,再次由于时间限制,是改变IIS回收配置,但我认为是理想的解决方案,基于我的研究,当然下面的答案,是创建一个"工作服务"并使用ASP.NET应用程序和新的"工作服务"之间的通信解决方案来协调要完成的长时间工作.

c# asp.net asynchronous

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