我用多线程做了一个打字游戏源代码如下
 private void timer1_Tick(object sender, EventArgs e)
        {
            Label l = new Label();
            l.AutoSize = true;
            r = new Random();
            l.Left = r.Next(0, this.Width);
            l.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            l.Name = "label1";
            l.Top = 20;
            int i1 = 0;
            for (int i = 0; i < 100000; i++)
            {
                i1 = 65 + r.Next(57);
                if (i1 >= 91 && i1 <= 96)
                {                }
                else
                {
                    break;
                }
            }
            l.Text = l.Text = Convert.ToChar(i1).ToString();            this.Controls.Add(l);
           MoveLabel m=new MoveLabel(l);
            Thread thread = new Thread(new ThreadStart(m.Move));
            thread.Start();
}
 public class MoveLabel
  {
  //私有成员,Label标签
  Label _label;  //随机数对象,用来控制label的位置,即在X轴上的位置
  Random _rand = new Random();  /// <summary>
  /// 读写属性,对标签的设置与获取
  /// </summary>
  public Label Label
  {
  get
  {
  return this._label;
  }
  set
  {
  this._label = value;
  }
  }  /// <summary>
  /// 参数化构造方法
  /// </summary>
  /// <param name="label">标签</param>
  public MoveLabel(Label label)
  {
  this._label = label;
  }  #region 可删除的测试代码  ///// <summary>
  ///// 参数化构造方法重载1
  ///// </summary>
  ///// <param name="panel">整个Panel作为参数来传递</param>
  //public MoveLabel(Panel panel)
  //{
  // this._panel = panel;
  //}
  #endregion  #region 测试代码  /// <summary>
  /// 移动标签的方法
  /// </summary>
  public void Move()
  {
  //声明一个随机对象,用来作为lable的位置随机
  // _rand = new Random();  if (this._label != null)
  {
  while (true)
  {
  //让label向下落
  this._label.Top += 3;
    
  //测试,让_lable的横坐标随意变化
  this._label.Left = _rand.Next(0, 590);  //让线程休眠100毫秒
  Thread.Sleep(100);  if (this._label.Top == 450)
  {
  this._label = null;
  //关闭当前线程,因为lable已经被删除,这里是为了释放资源
  Thread.CurrentThread.Abort();
  }
  }
  }
  else
  {
  //关闭当前线程,因为lable已经被删除,这里是为了释放资源
  Thread.CurrentThread.Abort();
  }
  }  #endregion  }
线程间操作无效: 从不是创建控件“多线程打字游戏”的线程访问它。
public void Move()
  {
  //声明一个随机对象,用来作为lable的位置随机
  // _rand = new Random();  if (this._label != null)
  {
  while (true)
  {
  //让label向下落
  this._label.Top += 3;
错误地点
  Thread.Sleep(100);还有我感觉这个是休眠主线程的我想要休眠当前线程的应该怎么写,高手指点啊

解决方案 »

  1.   

    Thread.Sleep(100)就是休眠当前线程
      

  2.   

    线程间操作无效: 从不是创建控件“多线程打字游戏”的线程访问它。
    public void Move()
      {
      //声明一个随机对象,用来作为lable的位置随机
      // _rand = new Random();  if (this._label != null)
      {
      while (true)
      {
      //让label向下落
      this._label.Top += 3;
    错误地点
    主要看这里吧
      

  3.   

    这个代码不是我写的,我是看人家写的,我看人家说能用,所以我觉得是不是其他地方的问题想看看有没有真正的高手来解决一下,或者说写这个代码的人本身代码就有问题?我也是在网上搜多线程打字游戏的时候看见的。
    你说的应该是这样吧?
       Label l = new Label();
    l.BeginInvoke(m.Move,null);
    是这么写么?
    m.mov.BeginInvoke(l,this,null,null);
      

  4.   

    或者说是哪位大哥能给一个真正好用的多线程打字游戏的例子,不要那种放到一个集合里面遍历一下就完了的,最好是一个线程去管理一个Label。而不是通过用集合来管理Label
      

  5.   

    线程间操作无效的错误,网上google,百度一大把
    明显没有自己去尝试解决过
    解决方法1,用委托
    解决方法2,用vs2003
    解决方法3,Control.CheckXXXXXXXXXXXXXXX=false;