Wir haben einen Remoting-Singleton-Server, der in einem separaten Windows-Dienst läuft (nennen wir ihn RemotingService). Die Clients des RemotingService sind ASP.NET-Instanzen (viele).
Momentan rufen die Remoting-Clients RemotingService auf und blockieren, während der RemotingService-Aufruf bearbeitet wird. Der Remoting-Dienst wird jedoch kompliziert genug (mit mehr RPC-Aufrufe und komplexen Algorithmen), dass die asp.net-Worker-Threads für eine sehr lange Zeit (4-5 Sekunden) blockiert werden.
Nach diesem msdn-Artikel , wird dies nicht gut skalieren, weil ein asp.net Worker-Thread ist für jeden Remoting-RPC blockiert. Es rät zum Wechsel auf asynchrone Handler, um asp.net worker threads freizugeben.
Der Zweck eines asynchronen Handlers ist, einen ASP.NET-Thread-Pool freizugeben Thread, um zusätzliche Anfragen zu bearbeiten während der Handler den ursprüngliche Anfrage.
Das scheint gut zu sein, außer dass der Remoting-Aufruf noch einen Thread aus dem Thread-Pool aufnimmt. Ist dies der gleiche Thread-Pool wie die ASP.NET-Worker-Threads?
Wie soll ich meinen Remoting-Singleton-Server in ein asynchrones System verwandeln, sodass ich meine asp.net-Worker-Threads freigeben kann?
Ich habe wahrscheinlich einige wichtige Informationen verpasst, bitte lassen Sie es mich wissen, wenn Sie noch etwas wissen müssen, um die Frage zu beantworten.
Die Idee hinter dem ThreadPool ist, dass Sie damit die Anzahl der synchronen Threads steuern können, und wenn diese zu viele bekommen, verwaltet der Thread-Pool automatisch das Warten auf neuere Threads.
Der bearbeitete Asp.Net-Thread (AFAIK) kommt nicht aus dem Thread-Pool und sollte nicht von Ihrem Aufruf an den Remoting-Dienst beeinflusst werden (es sei denn, es handelt sich um einen sehr langsamen Prozessor und Ihre Remoting-Funktion ist sehr CPU-intensiv - In diesem Fall ist alles auf Ihrem Computer betroffen.)
Sie können den Remoting-Dienst immer auf einem anderen physischen Server hosten. In diesem Fall ist Ihr asp.net-Worker-Thread völlig unabhängig von Ihrem Remoting-Aufruf (wenn der Remoting-Aufruf in einem separaten Thread aufgerufen wird).