解决方案 »

  1.   

    事件的语法是类似于这样的定义        public delegate void OnOpenEventHandler(IPEndPoint endpoint, NetworkStream stream);
            public delegate void OnCloseEventHandler(NetworkStream stream);
            public delegate void OnMessageEventHandler(NetworkStream stream, string message);
            public delegate void OnErrorEventHandler(NetworkStream stream, Exception ex);
     
            public event OnOpenEventHandler OnOpen;
            public event OnMessageEventHandler OnMessage;
            public event OnErrorEventHandler OnError;其中,为事件委托定义参数。实际上参数还可以声明为复杂的自定义对象类型。
      

  2.   

    如果只是普通的方法参数定义委托类型,不需要支持自定义的类型名,那么可以使用预定义的Action<>来定义无返回值的委托。例如:classB 
     {
     public string ca(Action<string> mm)
     {
     MessageBox.Show("到这里了!");
    return mm("我");
     } }
      

  3.   

    既然要得到结果才能继续,那么只能顺序执行。
    如何安排顺序执行,可以有几种方法:
    1、不用异步,直接顺序执行(等待异步结果也认为是顺序执行)。
    2、continuation(也叫任务延续),比如Task.ContinueWith。
    3、使用Dotnet4.5的async await。第三种方法(内部实现也类似ContinueWith),写起来代码比较清晰,比如:async void button1_Click(object o, EventArgs e)
    {
        string m = await GetMM("world");
        this.Text = m;
    }async Task<string> GetMM(string name)
    {
        await Task.Delay(1000);
        return "hello " + name;
    }
      

  4.   

    操作是连续动态的,没办法预先设置完整的操作函数比如:业务需要向服务器传输2个文件MN和3个SQL语句ABC,当传输完M文件,需要得到结果P ,根据P决定是否继续传输N文件,N结束后,根据结果传输A,根据A的操作结果构造B,直到C完成,整个业务结束,对于另外的业务X,可能仅需要传输K文件即可
    对于业务F,,需要连续传输N个SQL语句所以必须得到每一步操作服务器返回的结果才行
      

  5.   


    委托的定义是在服务程序定义的,不是在客户程序定义的。客户程序只是提供委托的实现而已。所以如果你的客户程序写var  server = new B();
    server.ca(proc);private void proc(string mm)
    {
        .....
    }(
    这就是得到服务的返回值。当你访问服务功能时,服务来回调你的客户程序提供的委托方法,那么给你这个方法传递的调用参数就是你说的“返回值”。而如果服务程序定义的委托不是Action<string>,而是Func<string>,这就是服务程序需要得到你客户程序的返回值。因此在委托参数中定义string,这就是客户得到服务的返回值。而在委托的返回类型中定义string,这就是客户给服务去返回值。你所说的“返回”这个词儿是有歧义的,你没有理解前半句“委托参数是返回值”的意思。
      

  6.   

    至于说你的那个定义public delegate string tc();以及你的问题,就可以看出来,这种代码的含义不是什么服务给客户返回值,而是客户给服务返回值。
      

  7.   

    用异步委托实现多线程,然后在异步委托中的回调函数中将返回值传给一个变量?在线程中执行回调函数,获取县城返回值?int result = -1;            Func<int, int, int> action = (x, y) => { return x + y; };
                action.BeginInvoke(1, 2, new AsyncCallback(iar =>
                {
                    System.Runtime.Remoting.Messaging.AsyncResult ar = (System.Runtime.Remoting.Messaging.AsyncResult)iar;                Func<int, int, int> actionCB = (Func<int, int, int>)ar.AsyncDelegate;                result = actionCB.EndInvoke(iar);
                }), null);            while (true)
                {
                    if (result != -1)
                    {
                        Console.WriteLine(result);
                        break;
                    }
                }            Console.ReadKey();