2017-12-09 3 views
0

zu konvertieren Ich habe den folgenden Code in VB.Net. Es kompiliert und funktioniert wie gewünscht.Versuchen, diesen VB.Net ThreadStart WCF-Code in C#

In meinen Bemühungen, zu C# zu wechseln, versuche ich jedes Mal, wenn ich an einem neuen Projekt arbeite, C# zu verwenden, aber in diesem Fall fehlt mir eindeutig etwas.

Private m_Service As ServiceHost = Nothing 

Public Function Start(ByVal AddressToConnect As String) As Thread 
    Dim ServerProcess As New Thread(AddressOf WebService) 

    ServerProcess.Start(AddressToConnect) 

    Return ServerProcess 
End Function 

Private Sub WebService(ByVal AddressToListen As String) ' Address should be in the form: "http://localhost:8000/IHello" 
    ' Define where to listen 
    Dim Address As Uri = New Uri(AddressToListen) 
    ' Define how to exchange messages 
    Dim Binding As BasicHttpBinding = New BasicHttpBinding() 

    ' When the connection is established, define what object is created 
    m_Service = New ServiceHost(GetType(Worker), Address) 

    ' Add an endpoint, passing the address, binding and contract 
    m_Service.AddServiceEndpoint(GetType([Interface].IContract), Binding, Address) 

    ' YOU MUST PERFORM THE FOLLOWING BEFORE YOU ATTEMPT TO OPEN THE CONNECTION 
    ' netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user 

    ' Begin listening for connections 
    m_Service.Open() 
    Console.WriteLine("WCF Service started") 
End Sub 

Public Sub [Stop]() 
    m_Service.Close() 
    m_Service = Nothing 
End Sub 

Das gleiche in C# aus einem dieser VB zu C# Konversionsflächen sagt der folgende funktionieren sollte:

private ServiceHost _Service = null; 

public Thread Start(string AddressToConnect) 
{ 

    Thread ServerProcess = new Thread(new EventHandler(WebService)); 
    ServerProcess.Start(AddressToConnect); 
    return ServerProcess; 
} 


private void WebService(string AddressToListen) 
{ 
    // Address should be in the form: "http://localhost:8000/IHello" 
    // Define where to listen 
    Uri Address = new Uri(AddressToListen); 
    // Define how to exchange messages 

    BasicHttpBinding Binding = new BasicHttpBinding(); 

    // When the connection is established, define what object is created 
    _Service = new ServiceHost(typeof(Worker), Address); 

    // Add an endpoint, passing the address, binding and contract 
    _Service.AddServiceEndpoint(typeof(Interface.IContract), Binding, Address); 

    // YOU MUST PERFORM THE FOLLOWING BEFORE YOU ATTEMPT TO OPEN THE CONNECTION 
    // netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user 

    // Begin listening for connections 
    _Service.Open(); 
    Console.WriteLine("WCF Service started"); 
} 

public void Stop() 
{ 
    _Service.Close(); 
    _Service = null; 
} 

Das Problem ist, dass der Compiler beschwert sich über: Thema Serverprozesses = new Thread (neu EventHandler (WebService));

„Keine Überlast für WebService Spiele Eventhandler delegieren“

Was mache ich falsch? Was sollte der C# -Code sein?

Entschuldigung für was sollte eine einfache Frage sein, aber ich habe immer mit Delegierten gekämpft.

--EDIT--

Dank Markus, das ist, was ich habe jetzt:

public Thread Start(string AddressToConnect) 
    { 
     Thread ServerProcess = new Thread(WebService); 

     ServerProcess.Start(AddressToConnect); 

     return ServerProcess; 
    } 

Und die WebService-Methode ist jetzt:

private void WebService(object AddressToListen) 
    { 
     // Address should be in the form: "http://localhost:8000/IHello" 
     // Define where to listen 
     Uri Address = new Uri((string)AddressToListen); 
     // Define how to exchange messages 
... 
+0

Würde dies das Äquivalent sein? \t \t öffentliche Aufgabe Start (String AddressToConnect) \t { \t \t Task t = new Aufgabe (() => \t \t { \t \t \t WebService (AddressToConnect); \t \t}); \t \t t.Start(); \t \t zurück t; \t} –

+0

'neuer Thread (WebService (AddressToConnect)); 'versuche das ... Dann starte 'ServerProcess.Start();' ... – Codexer

+0

@Codexer: Ich habe versucht Thread t = new Thread (WebServiceAddressToConnect)); t.Start(); return t; und das kompiliert nicht –

Antwort

0

Sie können die AddressOf entfernen Operator. Es ist nicht in C# erforderlich:

Thread ServerProcess = new Thread(WebService); 

Eine Sache, obwohl zu beachten ist, dass das Verfahren Bedarf bereitgestellt, um die Unterschrift von ParameterizedThreadStart anzupassen. Dieser Vorgang dauert ein Objekt als Parameter, so dass Sie benötigen die Unterschrift Ihrer WebService-Methode zu ändern:

private void WebService(object AddressToListen) 

Bei dem Verfahren haben Sie das Objekt in eine Zeichenfolge zu konvertieren.

+0

Downvoter, interessieren sich zu kommentieren? – Markus

+0

Ich habe eine neue StartThread-Methode hinzugefügt und die Signatur wie vorgeschlagen geändert, und sie wird tatsächlich kompiliert. Ich werde aufschreiben, was ich herausgefunden habe, da Sie in der Tat genügend Informationen zur Verfügung gestellt haben, um den Rest auszuarbeiten. –