C#之跨线程访问控件【事件与委托】

  vs2010中,默认是不允许跨线程访问窗体控件的,而在执行某些费时任务时,往往希望显示一个进度条,使用委托是一个比较简单的解决办法。

  public partial class Form1 : Form
  {

    public delegate void Refresh(int proIndex);
    public Refresh refreshPro=new Refresh(ShowProgress);
    public void ShowProgress(int proIndex)

  }

  在其它线程只需执行(form1是Form1 的实例)

  form1.Invoke(form1.refreshPro, new Object[] { proIndex });

     事件可谓是委托的一个实例

  也可以给事件传递参数

  public class DataArgs:EventArgs

  {

    //添加一个参数data

    private string data;

    public string Data

    {

      get{return data;}

      set{data=value;}

    }

  }

  public class DataClass

  {

    public delegate void DealDataEventHandler(object sender,DataArgs args)

       public event DealDataEventHandler dealDataEvent;

       在其它方法的代码体中

    public void DealData()

    {

      if(dealDataEvent!=null) 

      {

        DataArgs dataArgs=new DataArgs();

        dataArgs.Data="hello";

        dealDataEvent(this,dataArgs);

      }

    }

    public  class PrintData

    {

      public void Print(object sender,DataArgs dataArgs)

      {

        Console.WriteLine("{0}",args.Data);

      }

    }

    调用示例:

    PrintData printData=new PrintData();

    DataClass dataClass=new DataClass();

    dataClass.dealDataEvent+=new DataClass.DealDataEventHandler(printData.print);

    dataClass.DealData();

    

     

posted @ 2011-10-28 13:14  hookecho  阅读(1367)  评论(0)    收藏  举报