现有一Client类的全局实例g_client,Client有一批Get开头的成员函数,GetXXX使用已经建立连接的socket发送请求并接收数据,GetXXX可能在各种窗口操作中调用(不并发),调用GetXXX大多数情况下允许阻塞,小部分不允许阻塞。GetXXX函数可以很复杂,但调用时代码要尽量精简。这种不允许阻塞的应如何设计?

解决方案 »

  1.   

    backgroudworker
    对同一个对象操作时候要lock
      

  2.   

    定义个 delegate ,参数列表和返回类型和 GetXXX 方法一致,再异步调用,
    比如:
    int GetXXX(int a)
    {
        // ......
    }delegate int Action(int a);调用:
    Action ac = GetXXX;
    ac.BeginInvoke(参数, null, null);
      

  3.   

    av的方法很好。
    m_client.BeginConnect(ConnectCompleted, m_client);
    但在ConnectCompleted中操作界面时会提示:线程间操作无效,从不是创建控件的线程访问它。
      

  4.   

    因为是异步,所有在有对界面控件操作的地方要加上
    该控件.Invoke((MethodInvoker)(() =>
    {
        // 对控件的直接操作 ,比如  控件.Text = 字符串,放在这里
         // 其他任何不是对控件的直接操作都别放这里
    }));
      

  5.   

    正要找这个Invoke+拉姆,太感谢了,结帖。