CSDN-CSDN社区-.NET技术-C#

收藏 关于异步委托的例子[问题点数:50,结帖人:wuqianju]

  • wuqianju
  • (wuqianju)
  • 等 级:
  • 结帖率:
楼主发表于:2008-11-27 10:49:08
虽然是例子,但是没看明白。希望高手给我解释下,谢谢。using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;
namespace 异步委托回调
{
    class Program
    {
        public delegate int Deleg(int a, int b);
        //异步委托一定要这个定义?或者说,这个定义在这个例子中起到了什么作用?        static AutoResetEvent ev = new AutoResetEvent(false);
        static int WriteSum(int i, int j)
        {
            Console.WriteLine("Thread#{0}:sum ={1}", Thread.CurrentThread.ManagedThreadId, i + j);
            return i + j;
        }
        static void SumDone(IAsyncResult async)
        {
            Thread.Sleep(1000);
          /*Deleg proc = WriteSum 和
            Deleg proc = ((AsyncResult)async).AsyncDelegate as Deleg有什么区别?*/

            Deleg proc = ((AsyncResult)async).AsyncDelegate as Deleg;
            int sum = proc.EndInvoke(async);
            Console.WriteLine("Thread#{0}:callback method sum={1}",
                Thread.CurrentThread.ManagedThreadId, sum);
          //下面这句具体做了什么??            ev.Set();
        }
        static void Main()
        {
            Deleg proc = WriteSum;
          //可否这么认为BeginInvoke中的第三个参数是异步委托回调时候才需要的?
            IAsyncResult async = proc.BeginInvoke(10, 10, SumDone, null);
            Console.WriteLine("Thread#{0}:BeginVoke() called! wait for sumDone() completion.",
                Thread.CurrentThread.ManagedThreadId);
            ev.WaitOne();
            Console.WriteLine("{0}:Bye...", Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
        }
    }
}
回复次数:6
#1楼 得分:5回复于:2008-11-27 10:54:34
呵呵,关于委托的异步调用,一两话将不清楚,参考:技术讲座:.NET委托、事件及应用兼谈软件项目开发
#2楼 得分:5回复于:2008-11-27 11:03:19
引用 1 楼 hulihui 的回复:
呵呵,关于委托的异步调用,一两话将不清楚,参考:技术讲座:.NET委托、事件及应用兼谈软件项目开发



是啊!还是先搞清楚运行的原理吧!
  • wangping_li用户头像
  • wangping_li
  • (总有一天,我星球上的人会来接我)
  • 等 级:
#3楼 得分:20回复于:2008-11-27 12:10:09
  • qiri07用户头像
  • qiri07
  • (C=2πR忘れ)
  • 等 级:
#4楼 得分:5回复于:2008-11-27 12:11:36
http://msdn.microsoft.com/zh-cn/library/ms173171.aspx
委托(C# 编程指南) 从MSDN获取知识吧
#5楼 得分:15回复于:2008-11-27 13:00:27
老实说你这个例子不是很让人清楚.还是我给你个例子吧!
这个是我实际开发中遇到的一个问题,和异步调用相关的业务逻辑是这样的:读取一个xls文件的内容,然后把改内容输出在winform中的一个datagridview上,
遍历一个xls文件是一个耗时操作,为避免在读取这段时间内,ui卡死在那,顾采用了多线程异步委托调用:主线程调用一个工作线程读取xls内容,填充到一个arraylist类的容器result中,工作线程将result的内容填充到ui的datagridview中.

过程是这样的:
用户点击按钮---- 浏览文件,选中一个目标,读取数据.

        //选取文件
        private void selectfile()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "xls文件(*.xls)|*.xls";
            ofd.DefaultExt = "xls";
         
            if (ofd.ShowDialog() == DialogResult.OK)
            {
              // 返回选择的文件名
                path = ofd.FileName;
                this.textBox1.Text = path;
                this.Refresh();
                //ReadFromXls 是一个功能类,作用是根据传递进去的路径读取一个xls文件内容,并填充Arraylist
                ReadFromXls rfx = new ReadFromXls(path);
                //work             
                WorkClass workclass = new WorkClass();
                workclass.WorkEvent += new dowork(workclass_WorkEvent);
                Thread workthread = new Thread(workclass.doit);
                workthread.Start(rfx);   

            }     
       
        }

void workclass_WorkEvent(object sender, EventArgs eventarg)
        {
            ArrayList result = ((WorkClass)sender).Result;
     
            if (this.dataGridView1.InvokeRequired)
            {
                setdgv setdgv1 = new setdgv(this.setDataGridView);
                this.dataGridView1.Invoke(setdgv1, new ArrayList[] { result });
            }


           
        }
#6楼 得分:0回复于:2008-11-27 14:19:05
基本答案出来了。我在理解理解就结贴。谢谢。
相关问题
求教,如何在异步委托中获得返回值? .NET技术/ C# - CSDN社区 ...
委托的BeginInvoke怎么用? .NET技术/ C# - CSDN社区community.csdn.net
***********讨论一个用完成例程实现异步I/O的问题 ...
帮澄清概念!委托和线程!! .NET技术/ VB.NET - CSDN社区community ...
请各位好心的高手解释一下"委托"的概念和用途.NET技术/ C# - CSDN社区 ...
关于摄像头录像(“PostMessage”以及“异步”如何实现)