2009-08-04 8 views
1

Für ein neues Webanwendungsprojekt mit .NET wird eine vorhandene Bibliothek (in C# geschrieben) online zur Verfügung gestellt, die einige Berechnungen zu Informationen in einem Datenmodell durchführt.Kann ich eine Nicht-ThreadSafe-Bibliothek in einer .NET-Webanwendung für mehrere Benutzer verwenden?

Die Bibliothek muss von vielen Benutzern gleichzeitig aufgerufen werden. Jeder Benutzer wird mit einem anderen Datensatz arbeiten. Benutzer können auch Modelldaten ändern und die Berechnung mit geänderten Eingabeparametern wiederholen.

Zur Zeit kann die Bibliothek nur ein Datenmodell gleichzeitig verarbeiten. (Nehmen wir an, es gibt Designprobleme wie statische Klassen und Singletons).

Wenn eine .NET-Webanwendung (ein einfaches Webfrontend mit HTML-Webseiten) diese Bibliothek verwenden möchte, steht eine Technologie zur Verfügung, um für jeden Client eine separate Instanz der Bibliothek zu erstellen, um die Modelle und andere Parameter beizubehalten getrennt?

+0

Die Benutzer müssen mit verschiedenen Modelldaten zur gleichen Zeit arbeiten, aber Ihre Bibliothek kann nur ein Modelldaten zu einem Zeitpunkt behandeln? Was Sie sagen, bedeutet, dass es nicht möglich ist, gibt es nur statische Klassen in dieser Bibliothek? Von welcher Bibliothek sprechen wir? –

+0

Angenommen, es gibt Designprobleme wie statische Klassen oder Singletons, die nicht schnell genug gelöst werden können. – mjn

Antwort

1

Sie können das Modul extern laden und jedes Mal eine neue Instanz erstellen oder das Objektpooling mithilfe von .NET Enterprise Services (COM +) verwenden. Wenn das Objekt jedoch statusbehaftet ist, haben Sie weiterhin Skalierbarkeitsprobleme.

Pro Kommentar: Ja, Sie können. Schauen Sie sich this example für einen Schnellstart an.

+0

Vielen Dank für den Link, COM + -Objektpooling ist eine sehr interessante Option – mjn

+0

Wissen Sie, ob ich COM + -Objektpooling in einer ASP.NET-Anwendung verwenden kann? – mjn

0

Wenn Sie möchten, dass Benutzer ein Singleton-Objekt innerhalb Ihrer ASP.NET-Anwendungsinstanz freigeben, muss es mit Thread-Sicherheit für alle Arten von Zugriffen und Änderungen implementiert werden.

Sie können einen Wrapper zum Verwenden und Verwalten der Instanzen der Bibliothek erstellen.

+0

Die Bibliothek sagt derzeit "Behandle mein wie ein Singleton", aber die Webanwendung möchte viele Instanzen mit unterschiedlichen Zuständen erstellen. Die grundlegende Frage ist, wie Sie viele Instanzen der Bibliothek erstellen und eine Web-Client-Sitzung an eine Bibliotheksinstanz binden. – mjn

0

Sie Verriegelung verwenden können, z.B .:

lock (typeof(YOUR_MODEL_CLASS)) 
{ 
} 

oder versuchen und Warteschlangen Berechnungen, die Parameter in einer Datenbank-Datei speichern und einen Service durchlaufen haben und jede Berechnung in seiner eigenen Zeit zu tun.

Es wird eine Schwelle geben, in der dies stabil/nutzbar sein wird.

+0

Das Laden des Modells kann eine Minute dauern, nachdem es abgeschlossen ist, müssen die Benutzer auf interaktive Weise damit arbeiten. Queuing/Load Balancing ist eine gute Idee, aber in diesem Fall würde das Wechseln zwischen Clientanforderungen und ihren Datensätzen viel Zeit in Anspruch nehmen. – mjn

0

Die meisten Klassen von .NET Framework sind nicht für den Multi-Thread-Zugriff vorgesehen, wie Sie im MSDN sehen können.

Wenn Sie sagen, Ihre Benutzer arbeiten mit verschiedenen Sätzen Daten, so dass Ihr Programm Instanzen der Klassen in der Bibliothek für jeden Benutzer erstellen muss - das klingt für mich unproblematisch.

Kritisch wäre es, wenn viele Benutzer mit dem gleichen Datensatz arbeiten würden, dann müssten Sie sich um die Multi-Threading-Fähigkeit der Bibliothek kümmern.

+0

Angenommen, es gibt Designprobleme wie statische Klassen oder Singletons, die nicht schnell genug aufgelöst werden können, sodass Datenmodellinstanzen nicht pro Benutzer erstellt werden können. – mjn

0

Wenn Sie über eine Komponente sprechen, die in einer Multithreadumgebung nicht als sicher eingerichtet ist, lautet die Antwort ja. Sie müssen jedoch einen Mechanismus auswählen, der den Zugriff auf die Komponente synchronisiert. Die einfachste Form in C# ist die "Lock" -Syntax.

Wenn Sie über eine Komponente sprechen, die jeweils nur eine Instanz zulässt, lautet die Antwort nein. Dies liegt daran, dass Webanwendungen in sich Multithread-fähig sind. Bei der Verwendung in asp.net müssen Sie den gesamten Server sperren, um zu warten, bis die Komponente beendet ist, was normalerweise eine schlechte Sache ist. Meine beste Lösung ist, die Verwendung einer solchen Komponente asynchron zu machen. Lassen Sie den Benutzer die Eingabeparameter angeben, speichern Sie diese Daten dann irgendwo und verwenden Sie einen Scheduler, um die Daten einzeln zu verarbeiten. Wenn der Prozess abgeschlossen ist, benachrichtigen Sie den Benutzer, dass die Arbeit abgeschlossen ist usw.

Wenn die Komponente viel Zeit zur Verarbeitung benötigt, ist es besser, den Benutzer nicht gleichzeitig mit der Komponente interagieren zu lassen.

+0

Dies ist genau die Antwort, vor der ich Angst hatte :) Sie haben recht mit den Vorteilen der asynchronen Verarbeitung, jedoch ist es nur die erste Initialisierung, die einige Zeit braucht, dann ist die Interaktion mit dem geladenen Datenmodell schnell. Das Problem würde beginnen, wenn viele Benutzer zwischen Modellen wechseln müssen, wenn jeweils nur ein Modell für die gesamte Webanwendung geladen werden kann, was ständig zu Initialisierungen führt. Das Binden einer Sitzung an eine Bibliotheksinstanz oder das Hinzufügen von Mehrbenutzerfunktionen zur Bibliothek sind die Optionen. Wissen Sie, ob ich COM + -Objektpooling in einer ASP.NET-Anwendung verwenden kann? – mjn

+0

Sie könnten. Aber ich bin nicht sicher, dass COM + alles lösen wird, wenn Sie nicht für jedes Modell einen separaten Pool erstellen können, da es die Modellladezeit ist, die das eigentliche Problem darstellt. Wenn ich mich richtig erinnere, haben COM + Pooled Instanzen keinen Zustand in ihnen, so dass dies möglicherweise nicht implementiert werden kann. – moin

Verwandte Themen