理解不了接口 IAsyncResult ar的AsyncState属性含义

nongfuxu123 2014-10-12 09:22:36
花了许多时间,还是搞不明白AsyncState属性含义。

请看以下几个应用例子

1)private void AAACallback(IAsyncResult ar){
...
string formatString = (string) ar.AsyncState;
}
2)private void BBBCallback(IAsyncResult ar){
...
client = (TcpClient)ar.AsyncState;
}
3)private void CCCCallback(IAsyncResult ar){
...
ReadWriteObject anC = (ReadWriteObject)ar.AsyncState; //ReadWriteObject是用户定义的类
}

这个ar.AsyncState到底怎样用啊? 怎样传送不同的对象参数?

请教各位了。
...全文
907 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可能有人不理解“定义这些方法,怎样被调用”。你定义的这些方法,被作为委托由系统I/O线程调用。也就是说,人家给你传参数,而不需要你给人家传参数。 所以当你看到这个代码的时候,不是你通过 ar.AsyncState 给人家传数据,而是你要去读取人家给你传的数据了。 要想知道这个数据怎么来的,应先看看这个委托是怎么注册给系统的。先从那里看起。
nongfuxu123 2014-10-13
  • 打赏
  • 举报
回复
MSDN也是个好地方。 public IAsyncResult BeginInvoke( Delegate method ) public IAsyncResult BeginInvoke( Delegate method, params Object[] args ) public delegate void MyDelegate(Label myControl, string myArg2); private void Button_Click(object sender, EventArgs e) { object[] myArray = new object[2]; myArray[0] = new Label(); myArray[1] = "Enter a Value"; myTextBox.BeginInvoke(new MyDelegate(DelegateMethod), myArray); } public void DelegateMethod(Label myControl, string myCaption) { myControl.Location = new Point(16,16); myControl.Size = new Size(80, 25); myControl.Text = myCaption; this.Controls.Add(myControl); }
nongfuxu123 2014-10-13
  • 打赏
  • 举报
回复
应该就是它了。 ... new AsyncCallback(SendCallback), READ_A ); -->READ_A = (ReadWriteObject)ar.AsyncState;
nongfuxu123 2014-10-13
  • 打赏
  • 举报
回复 1
是不是按以下这样子联系在一起的:
               
       READ_A.netStream.BeginWrite(   READ_A.writeBytes,
                                                        0, 
                                                        READ_A.writeBytes.Length, 
                                                        new AsyncCallback(SendCallback), 
                                                        READ_A );
       
       private void SendCallback(IAsyncResult ar) 
        {
            ReadWriteObject READ_A = (ReadWriteObject)ar.AsyncState;
            。。。。。
        }
Forty2 2014-10-13
  • 打赏
  • 举报
回复

        void Test()
        {
            Action action = delegate { Thread.Sleep(1000); };
            action.BeginInvoke(ActionEnded, "额外数据");
            action.BeginInvoke(ActionEnded, 1234);
        }

        void ActionEnded(IAsyncResult result)
        {
            if (result.AsyncState is string) MessageBox.Show("用户数据是字符串:" + (string)result.AsyncState); // 额外数据
            if (result.AsyncState is int) MessageBox.Show("用户数据是整数:" + (int)result.AsyncState);  // 1234
            //...
        }
nongfuxu123 2014-10-13
  • 打赏
  • 举报
回复
引用
把调用异步方法的你的代码所传送的对象参数给“读取”出来
这句话,偶还没好好理解。花点时间验证一下。
nongfuxu123 2014-10-13
  • 打赏
  • 举报
回复
首先,谢谢楼上二位这么晚还给我回复。
引用
定义一个可以允许你和调用者传递参数的渠道而已,这个属性是通用的,意味着不同的地方可以有不同的作用。
引用
你定义的这些方法,被作为委托由系统I/O线程调用。也就是说,人家给你传参数,而不需要你给人家传参数。
我找不到、或者说“ 不明白,我是怎么给它定义的 ”。 能不能给出一个说明它们的例子。
  • 打赏
  • 举报
回复
IAsyncResult 类型是非常严格的,有着非常明确的属性和方法。 但是其 AsyncState 属性不过就是一个最简单的 object 引用,把调用异步方法的你的代码所传送的对象参数给“读取”出来。
threenewbee 2014-10-12
  • 打赏
  • 举报
回复
就是定义一个可以允许你和调用者传递参数的渠道而已,这个属性是通用的,意味着不同的地方可以有不同的作用。 好比表格上的“备注”一栏,并不限定你写某种具体的内容一样。
nongfuxu123 2014-10-12
  • 打赏
  • 举报
回复
补充 ReadWriteObject类 定义
    class ReadWriteObject
    {
        public TcpClient client;
        public NetworkStream netStream;
        public byte[] readBytes;
        public byte[] writeBytes;

        public ReadWriteObject(TcpClient client) 
        {
            this.client = client;
            netStream = client.GetStream();
            readBytes = new byte[client.Size1];
            writeBytes = new byte[client.Size2];
        }

       .........
    }

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧