在执行BeginRead时,我是否总是需要将Socket作为state参数的一部分传递?

时间:2010-08-02 09:12:58

标签: c# sockets asynchronous

它在MSDN documentation中指出:

  

至少,您的state参数必须包含用于通信的已连接或默认Socket。由于您需要在回调方法中获取接收到的数据,因此应创建一个小类或结构来保存读取缓冲区以及任何其他有用信息。通过state参数将结构或类实例传递给BeginReceive方法。

但是我调用BeginRecieve并将实例方法作为我的AsyncCallback传递:

class MyClass
{
    private Socket mysocket;

    private void callback(IAsyncResult Result)
    {
        Record record = this.mysocket.EndReadRecord(Result);
        // Do things
        this.mysocket.BeginReadRecord(new AsyncCallback(callback), null);
    }

    // Other methods
}

假设mysocket仅设置一次(在构造函数期间),是否需要将我的套接字作为state参数的一部分传递,或者使用实例字段{{1}是否安全}?

1 个答案:

答案 0 :(得分:2)

如果您只是在回调期间触摸它,或者基本上是以孤立的方式触摸它,那么您将是安全的。

这往往是我处理委托的方式,在方法范围之外定义委托变量以在回调期间使用它。