2016-11-21 3 views
1

Immer wenn ich Window Forms verwende, funktioniert es gut, aber es gibt immer Fehler bei der Konsolenanwendung.WCF mit Duplex-Kommunikation

Fehler - Die Socketverbindung wurde abgebrochen. Dies kann durch einen Fehler verursacht werden, der Ihre Nachricht verarbeitet oder ein Empfangs-Timeout von dem Remote-Host oder einem zugrunde liegenden Netzwerkressourcenproblem überschritten wird. Lokaler Socket Timeout war '00: 01: 00 '.

Hier ist mein Code

Vertrag

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace ClassLibrary1 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IReportService" in both code and config file together. 
    [ServiceContract(CallbackContract=typeof(IReportServiceCallbak))] 
    public interface IReportService 
    { 
     [OperationContract(IsOneWay=true)] 
     void ProcessReport(); 
    } 

    public interface IReportServiceCallbak 
    { 
     [OperationContract(IsOneWay=true)] 
     void Progress(int percentage); 
    } 
} 

Dienst

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 
using System.Threading; 

namespace ClassLibrary1 
{ 
    public class ReportService : IReportService 
    { 

     public void ProcessReport() 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       Thread.Sleep(50); 
       OperationContext.Current.GetCallbackChannel<IReportServiceCallbak>().Progress(i); 
      } 
     } 
    } 
} 

Kunde

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 
using System.Threading.Tasks; 
using System.Threading; 

namespace DuplexClientsss 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      new Tests(); 

     } } 

    class Tests : ReportService.IReportServiceCallback 
    { 
     ReportService.ReportServiceClient obj; 
     public Tests() 
     { 
      obj = new ReportService.ReportServiceClient(new InstanceContext(this)); 
      obj.ProcessReport(); 
     } 
       public void Progress(int percentage) 
     { 
      Console.WriteLine(percentage); 
     } 
    } 



} 
+0

** Beachten Sie, dass das ereignisartige Verhalten von Duplex-Services nur innerhalb einer Sitzung funktioniert. ** - gefunden [hier] (https://msdn.microsoft.com/en-us/library/ms731064 (v = vs .110) .aspx) –

+0

Dies ist fast sicher konfigurationsbezogen. Stellen Sie sicher, dass die Clientsystem.ServiceModel-Konfiguration zwischen den beiden Service-Client-Bibliotheken identisch ist. –

+0

Ich habe dieselbe Konfiguration für WinForms verwendet und funktioniert. aber nicht mit Konsolenanwendung – user7190448

Antwort

0
new Task 
(
()=> 
{ 
     obj.ProcessReport(); 
} 
).Start(); 
+1

Wenn Sie Ihre eigene Frage beantworten möchten, ist das in Ordnung, aber bitte stellen Sie eine angemessene Erklärung Ihrer Lösung zur Verfügung. Diese Antwort macht ohne weitere Diskussion absolut keinen Sinn. –

+0

Ich weiß nicht genau, wie es funktionierte, aber ich nehme an, dass mein vorheriger Code Deadlock verursachte, weil ich nur einen Thread verwendete – user7190448