我想封装一个方法, 在这个方法里  首先创建一个异步方法,并告诉异步方法回调函数,然后在异步方法执行完毕后调用回调函数,这个回调函数应该能接收2个参数第一个参数是异步方法返回的值, 第二个参数是一开始就给定的我试着写了一下方法,但是是不能运行的 ,请教应该怎么实现我的想法呢 
  public static string GetData(string orgdata)
        {
            //DO EVERY  THING
            return orgdata ;
        }        private delegate string AsyncDelegate(string orgdata);        public void GetAsyncData(string orgdata,Action<string,string> abc,string b)
        {
            AsyncDelegate dlgt = new AsyncDelegate(GetData);            IAsyncResult ar = dlgt.BeginInvoke(orgdata,                 new AsyncCallback(abc),                 b);        }
     public void  main()
{
      string date  ="";      GetAsyncData(date  , abc,"b");}        private void abc(string a,string b)
        {
            conlog.Write(a+b);
        } 

解决方案 »

  1.   

    异步执行的方法的返回值是不能直接传递给回调函数的,需要通过变量中转。
            public class State
            {
                public string A;
                public string B;
            }
            public static string GetData(string orgdata, State state)
            {
                //DO EVERY  THING
                state.A = orgdata;
                return orgdata;
            }
            private void abc(IAsyncResult ar)
            {
                State state = ar.AsyncState as State;
                Console.WriteLine(state.A + state.B);
            }
            private delegate string AsyncDelegate(string orgdata, State state);        public void GetAsyncData(string orgdata, AsyncCallback abc, string b)
            {
                AsyncDelegate dlgt = new AsyncDelegate(GetData);
                State state = new State() { B = b };
                IAsyncResult ar = dlgt.BeginInvoke(orgdata, state, abc, state);        }
      

  2.   


    回调函数一定是要IAsyncResult ar 做参数吗 ?能不能用普通的回调函数实现这个功能?
      

  3.   

    BeginInvoke第四个参数是做啥的?
      

  4.   

    普通函数就直接传递给GetData作为参数即可,没必要使用BeginInvoke的AsyncCallback参数了。
    例如:
    public static string GetData(string orgdata,Action<string,string> abc)然后在GetData内部最后返回前去执行abc方法,顺便将要返回的值传递给abc作为参数调用。
      

  5.   

       public void GetAsyncData(string orgdata, Func<string, string> GetData, string b)
            {
                CAsyncOjb obj = new CAsyncOjb(GetData,b);
                GetData.BeginInvoke(orgdata, new AsyncCallback(callback), obj);
     
            }
                  private  void callback(IAsyncResult ar)
            {
              string b = ((CAsyncOjb)ar.AsyncState).Bvalue;
              string newOrgdata= ((CAsyncOjb)ar.AsyncState).GetData.EndInvoke(ar);
              MessageBox.Show(newOrgdata + b);            
            }      class CAsyncOjb
          {
              public CAsyncOjb(Func<string, string> getData, String bValue)
              {
                  GetData = getData;
                  Bvalue = bValue;
              }
              public string Bvalue { get; private set; }
              public Func<string, string> GetData { get; private set; }
          }
    调用
     Func<string,string>  GetData=new Func<string,string>(
                        r=>{
                        return r;
                        }
                        );
             GetAsyncData("sports", GetData, "b");
      

  6.   

    GetData处理给定的参数data=>异步完成时处理GetData返回值+之前传入的参数b输出,不知你要的是不是这样的效果
      

  7.   

    既然你的GetData方法是异步调用的,那么在GetData内部去执行那个Action<string,string> abc委托,自然也是在异步线程中执行的。
      

  8.   

    new AsyncCallback(abc)
    abc方法必须要与 AsyncCallback 委托 相匹配。