相关疑难解决方法(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万
查看次数

使用IHttpAsyncHandler异步调用WebService

这是基本设置.我们有一个ASP.Net WebForms应用程序,其页面包含一个需要访问外部Web服务的Flash应用程序.由于(安全我认为)Flash的限制(不要问我,我根本不是Flash专家),我们无法直接从Flash连接到Web服务.解决方法是在ASP.Net中创建Flash应用程序将调用的代理,然后调用WebService并将结果转发回Flash应用程序.

WebSite的流量非常高,问题是,如果Web服务完全挂起,那么ASP.Net请求线程将开始备份,这可能导致严重的线程饥饿.为了解决这个问题,我决定使用专为此目的而设计的IHttpAsyncHandler.在其中,我将使用WebClient异步调用Web服务并将响应转发回来.关于如何正确使用IHttpAsyncHandler的网上很少有样本,所以我只是想确保我做错了.我在这里的示例节目中使用我的用法:http://msdn.microsoft.com/en-us/library/ms227433.aspx

这是我的代码:

internal class AsynchOperation : IAsyncResult
{
    private bool _completed;
    private Object _state;
    private AsyncCallback _callback;
    private readonly HttpContext _context;

    bool IAsyncResult.IsCompleted { get { return _completed; } }
    WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
    Object IAsyncResult.AsyncState { get { return _state; } }
    bool IAsyncResult.CompletedSynchronously { get { return false; } }

    public AsynchOperation(AsyncCallback callback, HttpContext context, Object state)
    {
        _callback = callback;
        _context = context;
        _state = …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net asynchronous ihttpasynchandler

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

保持负载均衡器在长时间运行期间不会超时

我正在使用ASP.NET MVC 4来接受最大30 mb的视频上传.将视频上传到网站后,视频将使用HttpWebRequest发布到第三方Web服务.此上传到第三方服务必须完成并返回响应,然后我的网站才能向浏览器返回响应.在Rackspace Cloud Sites上,负载均衡器有30秒超时.如果我的站点没有通过负载均衡器返回响应30秒,则负载均衡器会向浏览器返回超时错误并终止请求.

所以我被告知需要发生的事情是,我的网站需要通过在我的网站将视频发送到第三方系统时将数据发送回浏览器来保持连接活动,以便负载均衡器不会超时.你将如何完成这项任务?

我正在寻找两件事 - 在上传过程中,我将什么作为数据发送回浏览器?我的实际响应是JSON,所以如果我能在最后保持我的常规JSON响应,那将是理想的.

最后,如何在同时发送保持活动数据的同时将HttpWebRequest上传到第三方?

-

作为参考,这是来自rackspace cloud的负载均衡器连接超时文档:http://www.rackspace.com/knowledge_center/article/connection-timed-out-error-message-1

他们没有为这个问题提供任何具体的解决方案.

asp.net asp.net-mvc load-balancing

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