2017-03-27 8 views
0

Wusste nicht, welchen Titel zu setzen, weil ich nicht genau weiß, was das Problem ist. Ich hatte eine funktionierende c# Code, ich wickelte es in dll Client von anderen Funktionen zu trennen, aber jetzt funktioniert es nicht wie beabsichtigt. Es ist ein Client-Server über udp. Hier ist mein Code:C# - dll funktioniert nicht richtig

HandlerFactory factory = new HandlerFactory(); 
     factory.RegisterHandler(RequestType.Options,() => new OptionsHandler()); 
     factory.RegisterHandler(RequestType.Unauthorized,() => new UnauthorizedHandler()); 
     factory.RegisterHandler(RequestType.Ok,() => new OkHandler()); 
     factory.RegisterHandler(RequestType.Invite,() => new InviteHandler()); 
     factory.RegisterHandler(RequestType.Bye,() => new ByeHandler()); 
     factory.RegisterHandler(RequestType.Error,() => new ErrorHandler()); 

     Application.SetCompatibleTextRenderingDefault(false); 


     Client client = new Client(factory); 
     client.Start(); 
     client.Register(); 

Und in Client:

private void Listen() 
    { 
     while (!_stopping) 
     { 
      try 
      { 
       var asyncResult = MyUdpClient.BeginReceive(HandleIncomingUdpRequest, null); 
       WaitHandle.WaitAny(new[] { _stopHandle, asyncResult.AsyncWaitHandle }); 
      } 
      catch (Exception ex) 
      { 
       using (var sw = new StreamWriter("log.txt")) 
       { 
        sw.WriteLine("Date:" + DateTime.Now + "\r\nError:" + ex.Message + "\r\n"); 
       } 
      } 
     } 
     MyUdpClient.Close(); 
    } 

private void HandleIncomingUdpRequest(IAsyncResult ar) 
     { 
      var received = MyUdpClient.EndReceive(ar, ref _serverAddress); 
      var requestString = Encoding.ASCII.GetString(received); 
      var type = Helper.GetRequestType(requestString); 
      if (type != RequestType.Trying && type != RequestType.Unknown) 
      { 
       ProcessRequest(type, requestString); 
      } 
     } 

Also wickelte ich es in dll, und jetzt ist es wie folgt verwenden:

 var factory = new Factory.HandlerFactory(); 
     factory.RegisterHandler(RequestType.Options,()=> new OptionsHandler()); 
     factory.RegisterHandler(RequestType.Unauthorized,() => new UnauthorizedHandler()); 
     factory.RegisterHandler(RequestType.Ok,() => new OkHandler()); 
     factory.RegisterHandler(RequestType.Invite,() => new InviteHandler()); 
     factory.RegisterHandler(RequestType.Bye,() => new ByeHandler()); 
     factory.RegisterHandler(RequestType.Error,() => new ErrorHandler()); 
     Client cl = new Client(factory); 
     cl.Start(); 
     cl.Register(); 
     cl.Call("2"); 

Das Problem ist, auf cl.Call("2") Ich bekomme "Eine nicht behandelte Ausnahme vom Typ 'System.ObjectDisposedException' in System.dll aufgetreten" in

   var received = MyUdpClient.EndReceive(ar, ref _serverAddress); 

Und in Register(), Client sollte Register Request senden, erhalten Antwort, dass er nicht unbefugt ist und UnauthorizedHandler aufrufen, aber das ist nicht passiert.

+3

Sie müssen den Aufruf-Stack in der Exception überprüfen, um festzustellen, * welcher * Typ entsorgt wurde - damit können Sie wahrscheinlich herausfinden, was passiert. –

+0

Ich debuggte DLL und gefunden, was das Problem war, danke! – Jamil

Antwort

0

Das Problem war - ich weiß nicht, wie es passiert ist - in diesem Code:

private void Listen() 
    { 
     while (!_stopping) 
     { 
      try 
      { 
       var asyncResult = MyUdpClient.BeginReceive(HandleIncomingUdpRequest, null); 
       WaitHandle.WaitAny(new[] { _stopHandle, asyncResult.AsyncWaitHandle }); 
      } 
      catch (Exception ex) 
      { 
       using (var sw = new StreamWriter("log.txt")) 
       { 
        sw.WriteLine("Date:" + DateTime.Now + "\r\nError:" + ex.Message + "\r\n"); 
       } 
      } 
      MyUdpClient.Close(); 
     } 
    } 

MyUdpClient.Close() innerhalb der Schleife aufgerufen wurde. Ich muss try-catch Blöcke geändert haben und versehentlich das innerhalb der Schleife setzen, und wenn ich diese Frage stellte, kopierte ich es von der anderen Quelle.

1

Nur von der angegebenen Zeile und Ihrer Beschreibung würde ich überprüfen, ob ref _serverAddress korrekt initialisiert wurde, da es sich um eine globale Variable handelt, die höchstwahrscheinlich in Ihrer Haupt-App enthalten ist, aber Sie haben die Verwendung in die DLL verschoben.

+0

Um Ihren Code in Ihrer Antwort zu verbessern, rufen Sie MyUdpClient.Close() auf; im letzten Block des Try-Catch. – Bobo