2010-06-01 10 views
6

Ich versuche einige WCF-Sachen zu konfigurieren. Derzeit habe ich einen Server, der es entfernten Benutzern ermöglicht, Dateien und Clients herunterzuladen. Im Server verwende ich eine ServiceHost-Klasse. Ich nehme an, dass es in einem separaten Thread ausgeführt werden sollte, jedoch wird die Server-Benutzeroberfläche (WinForms) gesperrt, wenn jemand eine Datei herunterlädt. Gibt es eine Möglichkeit, das WCF-Threading-Modell zu verwalten?WCF Threading - nicht reagierende UI

Vielen Dank!

+0

Wie hosten Sie den Service? Ist es ein Windows-Dienst oder ein benutzerdefiniertes Hosting mit einigen EXE? – Kangkan

+0

Die ausführbare WinForms-Datei hostet die WCF-Servicebibliothek. – SharpAffair

Antwort

1

"Aus der gleichen Windows Form-Anwendung, wenn Sie die ServiceHost-Instanz vor dem Starten des UI-Threads erstellen, wird es auf einem eigenen Thread ausgeführt. Das bedeutet Worker-Threads aus dem Thread Pool Nachrichten statt der Nachrichtenschleife verarbeitet. Daher können Dienste mehrere gleichzeitige Anforderungen verarbeiten. "

+1

Dies führt zu einer Funktionalität, die der unten angegebenen Antwort entspricht. Da Sie den ServiceHost erstellen, bevor die SycnhronizationContext.Current -Eigenschaft auf eine Instanz von WindowsFormsSynchronizationContext festgelegt wird (z. B. bevor Steuerelemente erstellt wurden), versucht Ihr ServiceHost nicht, Serviceanforderungen im UI-Thread zu verarbeiten. Der Vorteil meiner Lösung besteht darin, dass dieses Verhalten eine Angelegenheit der Politik ist, so dass es egal ist, an welchem ​​Punkt Sie sich entscheiden, Ihren ServiceHost zu erstellen. – luksan

0

Sie sollten keinen WCF-Dienst in einem UI-Programm hosten. WCF verfügt über ein sehr spezifisches Threading-Modell, das verhindert, dass Ihre Benutzeroberfläche ordnungsgemäß ausgeführt wird.

Grundsätzlich ändert sich das WCF-Threadingschema abhängig vom ausgewählten Instanzverwaltungsverhalten. Wenn der Dienst während eines Zeitraums keine Anfragen erhält, kann WCF den laufenden Thread anhalten. All dies wird Probleme mit der Benutzeroberfläche verursachen.

Was ich in diesen Situationen mache, ist ein Windows Service hosting WCF zu erstellen und einen ServiceContract zu erstellen, um die erforderlichen Daten für die Überwachungsbenutzeroberfläche verfügbar zu machen. Diese Benutzeroberfläche wird unabhängig in ihrer eigenen EXE ausgeführt, da sie ein anderer Client des Dienstes ist, der die Daten nach Bedarf aus dem Dienst holt.

Ich hoffe, macht Sinn für Sie.

11

Sie sollten der Klasse, die Ihren Dienst implementiert, ServiceBehaviorAtttribute hinzufügen und die Eigenschaft UseSynchronizationContext auf false setzen. Dies führt dazu, dass Anrufe an Ihren Dienst in einem eigenen Thread verarbeitet werden.

Beispiel:

[ServiceBehavior(UseSynchronizationContext=false)] 
class YourService : IYourService 
{ 
    // Service Methods 
} 

Denken Sie daran, dass, wenn Sie irgendwelche Kontrollen innerhalb Ihrer Service-Methoden aktualisieren werden, die Sie im Auge der cross-thread programming model of Windows Forms tragen muss.

+0

WOW + 1 kannte diese Funktion nicht! –

+0

Dies ist die Lösung für ~ 2 Tage Bug-Suche von mir, warum ein WCF-Service funktioniert nicht auf einer Nicht-UI-App (App hat sowohl UI und nicht UI-Modus). Vielen Dank. –