2017-03-27 11 views
0

問題が何であるか正確にはわからないため、どのタイトルを設定するのか分かりませんでした。 私は働いていたc#コードを持っていましたが、それをdllにラップして、他の機能からクライアントを分離しましたが、意図したように機能しません。 udpを超えるクライアント/サーバーです。c# - dllが正常に動作しない

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(); 

とクライアントで:ここに私のコードである上、

 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"); 

を、問題がある:

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); 
      } 
     } 

だから、私はこのようにそれを使用今DLLにそれを包み、 cl.Call("2")「処理されていない例外がSystem.dllでSystem.ObjectDisposedExceptionが発生しました」

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

Register()では、クライアントはRegister Requestを送信し、Unauthorizedではないという応答を取得し、UnauthorizedHandlerにコールする必要がありますが、これは起こっていません。

+3

例外のコールスタックを検査して、どのタイプが廃棄されたかを判断する必要があります。これにより、おそらく何が起きているのかを知ることができます。 –

+0

私はdllをデバッグし、何が問題なのかを知りました。ありがとう! – Jamil

答えて

0

問題だった - 私はそれが起こったのか分からない - このコードで:

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()は、ループ内で呼ばれていました。私はtry-catchブロックを変更してしまい、誤ってループの中に入れてしまっているはずです。私がこの質問をしたとき、別のソースからコピーしました。

1

ref _serverAddressは、主なアプリケーションではおそらく誘惑されているが、使用量をdllに移動したグローバル変数のように正しく初期化されているかどうかを確認します。

+0

答えの中でコードを改善するには、MyUdpClient.Close()を呼び出します。最終的にtry-catchのブロックに入ります。 – Bobo

関連する問題