2012-02-08 60 views
8

私は、ソケットプログラミングを学んだし、私は次の機能があります。AsyncCallback関数に引数を渡しますか?

public void OnDataReceived(IAsyncResult asyn) 

をし、これは、コールバックが設定されます方法です:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived); 

問題は、私はOnDataReceivedコールバックに別の引数を渡す必要がありますどのように私はこれを行うことができますか?私は単純なtcpサーバを作ろうとしており、どのクライアントからデータが来ているのかを追跡する必要があります。任意のヒント?ありがとう!

+0

[非同期委任のプログラミングサンプル](http://msdn.microsoft.com/en-us/library/h80ttd5f.aspx) – sll

答えて

7

ここではSystem.Net.Sockets.Socketを使用していると仮定します。 BeginReceiveのオーバーロードを見ると、objectパラメータ(stateという名前)が表示されます。あなたはこのパラメータとして任意の値を渡すことができ、それはあなたのAsyncCallbackコールバックに流れます。コールバックに渡されたIAsyncResultオブジェクトのAsyncStateプロパティを使用してそれにアクセスできます。例えば;

public void SomeMethod() { 
    int myImportantVariable = 5; 
    System.Net.Sockets.Socket s; 
    s.BeginReceive(buffer, offset, size, SocketFlags.None, new new AsyncCallback(OnDataReceived), myImportantVariable); 
} 

private void OnDataReceived(IAsyncResult result) { 
    Console.WriteLine("My Important Variable was: {0}", result.AsyncState); // Prints 5 
} 
+0

ありがとう、それは私の問題を解決しました! – user1192403

+0

@ user1192403うれしいこと:) – MrMDavidson

+0

複数のパラメータを渡すとどうなりますか? –

2

あなたがBeginReceiveを呼び出すときは、その最後のパラメータとして任意のobjectを渡すことができます。同じオブジェクトは、IAsyncResultAsyncStateプロパティを通じてコールバックで利用できるようになります。

3

これは私が匿名の代表者で解決することを好むの問題である:それは受信機能に状態オブジェクトをキャストすることがなくなります

var someDataIdLikeToKeep = new object(); 
mySocket.BeginBlaBla(some, other, ar => { 
     mySocket.EndBlaBla(ar); 
     CallSomeFunc(someDataIdLikeToKeep); 
    }, null) //no longer passing state as we captured what we need in callback closure 

関連する問題