程序代码过程示例如下,大体是一个窗体在新线程里调用了另一个窗体的控件,不知道为什么一直不可以用//程序一启动就开个新线程,调用DrawMap方法
 private void map_Load(object sender, EventArgs e)
        {
               Thread threadListen = new Thread(new ThreadStart(DrawMap));
               threadListen.Start();
          
        }//在这里他调用了一个函数,不断的在另一个窗体里显示字符串
 private void DrawMap ( )
        {
          while(true)
           {
                DrawMap("123");
           }
        }//一个线程调用另一个线程的控件
  private delegate void viewDelegate (string s);
 private void view( string s)
        {
            if (this.InvokeRequired )
            {
               //程序执行到这里以后,上边的判断this.InvokeRequired 一直是true
                viewDelegate myDelegate = new viewDelegate(view);
                myDelegate.Invoke(s);
            }
            else
            {
               form2.lable.text=s;
             }
        }
大家帮帮忙  给解决一下

解决方案 »

  1.   

    this.InvokeRequired,改成 控件名.InvokeRequired
      

  2.   

     private delegate void viewDelegate (string s);
     private void view( string s)
            {
                if (this.InvokeRequired )
                {
                   //程序执行到这里以后,上边的判断this.InvokeRequired 一直是true
                    viewDelegate myDelegate = new viewDelegate(view);
                    myDelegate.Invoke(s);
                }
                else
                {
                   form2.lable.text=s;
                 }
            }这个对吗?
      

  3.   

     private void DrawMap ( )
            {
              while(true)
               {
                    DrawMap("123");
               }
            }这个函数在自调递归?
      

  4.   


    private delegate void viewDelegate (string s); 
    private void map_Load(object sender, EventArgs e)
            {
                   Thread threadListen = new Thread(new ThreadStart(DrawMap));
                   threadListen.Start();
                   viewDelegate myDelegate = new viewDelegate(view);
            }private void DrawMap ( )
            {
              while(true)
               {
                    form2.lable.invoke(myDelegate,"123");
               }
            }private void view( string s)
    {
       form2.lable.text=s;
                 
    }
      

  5.   

    myDelegate.Invoke(myDelegate,new object[]{});
      

  6.   

    也有可能是你这个函数锁住了:
     private void DrawMap ( )
            {
              while(true)
               {
                    DrawMap("123");
               }
            }
    //用同样的方法改一下DrawMap("123");
      

  7.   

    Invoke(myDelegate,new object[]{}); 这样
      

  8.   

    凡是涉及到线程操作界面的,都要invoke,否则UI线程会与你的线程死锁的,
      

  9.   

    .NET WinForm中 一个 跨线程访问控件的示例using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace DelegateSample
    {
    /// <summary>
    /// 这里声明一个委托供线程调用
    /// </summary>
    /// <param name="txt"></param>
    public delegate void AppendTextHandler(string txt);public partial class Form1 : Form
    {
    Thread m_trd = null;
    //实例化一个委托对象
    AppendTextHandler m_handler = null;public Form1()
    {
    InitializeComponent();
    }/// <summary>
    /// 窗体Load 事件
    /// </summary>
    /// <param name="e"></param>
    protected override void OnLoad(EventArgs e)
    {
    base.OnLoad(e);
    //实例化一个委托对象
    m_handler = new AppendTextHandler(AppendTextText);//开启新线程
    m_trd = new Thread(new ThreadStart(OtherThreadDoSomething));
    m_trd.Start();
    }/// <summary>
    /// 关闭窗体时结束创建的线程
    /// </summary>
    /// <param name="e"></param>
    protected override void OnClosed(EventArgs e)
    {
    base.OnClosed(e);
    if (m_trd != null)
    {
    m_trd.Abort();
    }
    }/// <summary>
    /// 线程执行的方法
    /// </summary>
    private void OtherThreadDoSomething()
    {
    string _str;
    while (Thread.CurrentThread.ThreadState!=ThreadState.Aborted)
    {//线程未请求终止就一直执行
    _str = System.Guid.NewGuid().ToString();
    AppendTextText(_str);
    Thread.Sleep(50);//可去掉
    }
    }/// <summary>
    /// 向当前窗体控件中增加文本
    /// </summary>
    /// <param name="txt"></param>
    private void AppendTextText(string txt)
    {
    if (this.richTextBox1.InvokeRequired)
    {//调用方在另外一个线程中
    //在拥有此控件的线程上执行委托指向的方法
    this.richTextBox1.Invoke(m_handler, txt);
    }
    else
    {//调用方在当前线程中
    this.richTextBox1.AppendText(txt + "\r\n");//增加文本
    this.richTextBox1.ScrollToCaret();//滚动到当前目录
    }
    }
    }
    }
      

  10.   

    谢谢大家  问题解决了  invoke方法参数传递问题