“回调中没有设置对象实例的对象引用”错误

时间:2013-02-19 13:22:49

标签: c# multithreading asynchronous push-notification ihttpasynchandler

我正在使用IHttpAsyncHandler和XMLHTTPRequest借助以下网址将消息推送到客户端:http://www.codeproject.com/Articles/42734/Using-IHttpAsyncHandler-and-XMLHttpRequest-to-push 但我做了一些更改,实际上这个示例仅基于一个客户端,我必须向多个客户端发送消息,因此我进行了这些更改

public void ProcessRequest(HttpContext context)
{
        var recipient = context.Request["recipient"]; 
        lock (_obj)
        {               
            string[] totalfrnds = ("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20").Split(',');//<- This is just an example for many clients

            foreach (var a in totalfrnds)
            {
                var handle = MyAsyncHandler.Queue.Find(q => q.SessionId == a);//<- check who's client is online or not

                if (handle != null)
                {
                    handle.Message = context.Request["message"];

                    handle.SetCompleted(true);
                }
            }
        }
 }

Error Snapshot

现在我有两个问题

  1. 如何解决此类错误?这不是永久性错误,它是随机发生的。

  2. W3wp.exe中异步线程的限制是什么,因为当它超过25请求时它无法打开下一个请求,我必须重置IIS才能重新启动应用程序。

1 个答案:

答案 0 :(得分:1)

  

如何解决此类错误?

您有race condition - 更改SetCompleted方法,以便在调用时获取Callback的副本,例如

var handler = Callback;
if (isCompleted && handler != null)
{
    handler(this);
}

  

W3wp.exe中异步线程的限制是什么

这是在服务器上的machine.config文件中配置的,特别是<processModel>部分中的 maxWorkerThreads 元素,根据默认为 20 <的文档/强>:

  

基于每个CPU配置要用于进程的最大工作线程数。例如,如果单处理器服务器上的此值为25,则ASP.NET使用运行时API将进程限制设置为25.在双处理器服务器上,限制设置为50. 默认值为20 即可。 maxWorkerThreads的值必须等于或大于配置部分中的minFreeThread属性设置。