泡泡

              宠辱不惊-闲看庭前花开花落
                           去留无意-漫观天外云展云舒
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

异步委托调用

Posted on 2007-09-14 12:53  AlanPaoPao  阅读(172)  评论(0)    收藏  举报
    先定义一个Tank开火的委托,接收两个参数:攻击目标,火力
public delegate string Firing(int aim, int power);
    定义一个Tank类
public class Tank
{
  
private int _id;
  
private int _armor;
  
private int _power;
  
public Firing FiringInstance;
  
public Tank(int id, int armor, int power)
  
{
    
this._id = id; this._armor = armor; this._power = power;
  }

  
public int ID
  
{
    
get
    
{
      
return this._id;
    }

  }

  
public void Fire(int aim)
  
{
    
if (FiringInstance != null)
    
{
      FiringInstance.BeginInvoke(aim,
this._power, new System.AsyncCallback(CallBackMethod), DateTime.Now);
    }
 
  }

  
public string Hit(int power)
  
{
    
if (this._armor == 0)
    
{
      
return this._id.ToString() + "以在之前击毁了";
    }

    
this._armor -= power;
    
if (this._armor <= 0)
    
{
      
this._armor = 0;
      
return this._id.ToString() + "被击毁了";
    }

    
else
    
{
      
return this._id.ToString() + "被击中了,还剩余能量:" + this._armor.ToString();
    }
       
  }

  
private void CallBackMethod(IAsyncResult asyncResult)
  
{
    
string result = FiringInstance.EndInvoke(asyncResult);
    DateTime dateTime 
= (DateTime)asyncResult.AsyncState;
    Console.Out.WriteLine(
this._id.ToString() + "" + dateTime.ToLongTimeString() + "发射的导弹:" + result);
  }

}
    再定义个Tank的控制类,包含Tank集合
public class TankList
{
  
private List<Tank> _tankList;
  
public TankList()
  
{
    
this._tankList = new List<Tank>();
  }

  
public void AddTank(Tank tank)
  
{
    tank.FiringInstance 
= new Firing(this.FiringCommand);  
    
this._tankList.Add(tank);
  }

  
public Tank GetTank(int index)
  
{
    
return this._tankList[index]; 
  }

  
private string FiringCommand(int aim, int power)
  
{
    
for (int i = 0; i < this._tankList.Count; i++)
    
{
      Thread.Sleep(
1000); 
      
if (this._tankList[i].ID == aim)
      
{
        
return this._tankList[i].Hit(power);
      }

    }

    
return "未找到目标";
  }

}
    简单的调用实现,初始化8辆Tank之后,为其注册事件,发生异步调用
public class Program
{
  
static void Main(string[] args)
  
{
    Random random 
= new Random(DateTime.Now.Millisecond);
    TankList tankList 
= new TankList();
    
for (int i = 0; i < 8; i++)
    
{
      Tank t 
= new Tank(i, 100, random.Next(1030));
      tankList.AddTank(t);
    }

    
for (int i = 0; i < 20; i++)
    
{
      
int aimi, aimo;
      aimi 
= random.Next(08);
      aimo 
= random.Next(08);
      System.Console.WriteLine(
"" + i.ToString() + "次开火,从" + aimi.ToString() + "打向" + aimo.ToString());
      tankList.GetTank(aimi).Fire(aimo);
      Thread.Sleep(
500);
    }

    System.Console.ReadLine();
  }

}