有时候,我都真想直接去商场门口发传单,举牌子了
请一定帮忙,谢谢!
请看看:
http://community.csdn.net/Expert/topic/3663/3663763.xml?temp=.569195

解决方案 »

  1.   

    public class ThreadClass
    public event EventHandler ThreadEndA;
    public event EventHandler ThreadEndB;
    public void ThreadProcA()
    {
            //你的代码
    if(ThreadEndA!=null)
    ThreadEndA(this,EventArgs.Empty);
    }
    public void ThreadProcB()
    {
            //你的代码
    if(ThreadEndB!=null)
    ThreadEndB(this,EventArgs.Empty);
    }
    //你的主程序中
    ThreadClass objThread=new ThreadClass();
    objThread.ThreadEndA +=new EventHandler(this.第一线程结束的响应);
    objThread.ThreadEndB +=new EventHandler(this.第二线程结束的响应);
    Thread ta = new Thread(new ThreadStart(objThread.ThreadProcA));
    Thread tb = new Thread(new ThreadStart(objThread.ThreadProcB));//启动ta、tb
      

  2.   

    响应方法按EventHandler格式写
    public void XXXXX(object sender,EventArgs e)
    {
    //响应代码
    }当然如果你要在线程结果的事件中传信息那就不要用这个委托,自己定一定参数类,定义个委托再由自定义委托定义事件
      

  3.   

    谢谢 welshem(天堂客) ,我试一下。
      

  4.   

    welshem(天堂客),请把
    objThread.ThreadEndA +=new EventHandler(this.第一线程结束的响应);
    objThread.ThreadEndB +=new EventHandler(this.第二线程结束的响应);
    写出个简单的例子,好吗/谢谢
      

  5.   

    你的主程序中加方法:
    public void CallBackA(object sender,EventArgs e)
    {
    //响应代码
    }
    public void CallBackB(object sender,EventArgs e)
    {
    //响应代码
    }objThread.ThreadEndA +=new EventHandler(this.第一线程结束的响应);
    objThread.ThreadEndB +=new EventHandler(this.第二线程结束的响应);
    改为
    objThread.ThreadEndA +=new EventHandler(this.CallBackA);
    objThread.ThreadEndB +=new EventHandler(this.CallBackB);可以吗
      

  6.   

    老兄:
    我 改完后提示这个,不知为什么?关键字 this 在静态属性、静态方法或静态字段初始值设定项中无效public void CallBackA(object sender,EventArgs e)
    {
         xxx="aa";
    }
    public void CallBackB(object sender,EventArgs e)
    {
         yyy="bb";
    }
      

  7.   

    谢谢,welshem(天堂客),问题解决后,另开贴谢谢你,一定要过来接分啊。
    请再看一下。
      

  8.   

    还有,请welshem(天堂客)回答完问题后,不要马走,谢谢。
      

  9.   

    你在静态方法中调用了CallBackA/CallBackB了
    改一下:
    public static void CallBackA(object sender,EventArgs e)
    {
         xxx="aa";
    }
    public static void CallBackB(object sender,EventArgs e)
    {
         yyy="bb";
    }objThread.ThreadEndA +=new EventHandler(CallBackA);
    objThread.ThreadEndB +=new EventHandler(CallBackB);注意,xxx、yyy也要是静态的
    可以吗
      

  10.   

    不过不过有一个办法是
    你在静态主方法中实例当前类,这样只要改
    objThread.ThreadEndA +=new EventHandler(this.CallBackA);
    objThread.ThreadEndB +=new EventHandler(this.CallBackB);

    objThread.ThreadEndA +=new EventHandler(当前类的实例变量.CallBackA);
    objThread.ThreadEndB +=new EventHandler(当前类的实例变量.CallBackB);
    上帖的不用改也行
      

  11.   

    谢谢welshem(天堂客),我的程序可以运行了。有问题再请教你。请明天再来接分。我另开一贴再给你.
      

  12.   

    以下是我的一个webform测试程序
    请问怎样改才能正确?using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Threading;namespace test
    {
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.TextBox txtA;
    protected System.Web.UI.WebControls.TextBox txtB;
    protected System.Web.UI.WebControls.Button Button1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void Button1_Click(object sender, System.EventArgs e)
    {
    ThreadClass objThread=new ThreadClass();
    objThread.ThreadEndA +=new EventHandler(CallBackA);
    objThread.ThreadEndB +=new EventHandler(CallBackB);
    Thread ta = new Thread(new ThreadStart(objThread.ThreadProcA));
    Thread tb = new Thread(new ThreadStart(objThread.ThreadProcB)); tb.Start();
    ta.Start();
    } public static void CallBackA(object sender,EventArgs e)
    {
    txtA.Text="a";
    }
    public static void CallBackB(object sender,EventArgs e)
    {
    txtB.Text="b";
    } } public class ThreadClass
    {
    public event EventHandler ThreadEndA;
    public event EventHandler ThreadEndB;
    public void ThreadProcA()
    {
    //你的代码
    if(ThreadEndA!=null)
    ThreadEndA(this,EventArgs.Empty);
    }
    public void ThreadProcB()
    {
    //你的代码
    if(ThreadEndB!=null)
    ThreadEndB(this,EventArgs.Empty);
    }
    }
    }

    public static void CallBackA(object sender,EventArgs e)
    {
    txtA.Text="a";
    }
    public static void CallBackB(object sender,EventArgs e)
    {
    txtB.Text="b";
    }处有错误
      

  13.   

    这次你不是在静态方法中调用的所以
    public static void CallBackA(object sender,EventArgs e)
    {
    txtA.Text="a";
    }
    public static void CallBackB(object sender,EventArgs e)
    {
    txtB.Text="b";
    }
    改为
    public void CallBackA(object sender,EventArgs e)
    {
    txtA.Text="a";
    }
    public void CallBackB(object sender,EventArgs e)
    {
    txtB.Text="b";
    }
      

  14.   

    关键是去掉后没有值了?我的txtA.Text和txtB.Text的值都没显示啊?
      

  15.   

    还有个小问题:你的页面不会等你的线程执行完
    解决方法是阻塞当前线程:

    tb.Start();
    ta.Start();
    后加
    Thread.Sleep(1000);OK
      

  16.   

    我得把主线程sleep才能显示?但这不是我要的结果,我是想主线程不sleep就能显示.
      

  17.   

    哥们,我和你说的都是我的测试程序,但我真正用的不是这个啊。
    我是要抓取网页程序,用两个线程抓取两个不同的网页,我也不知道抓取网页时所用的时间,
    所以sleep也是不一定的啊。要是刚好某一个网页出了问题,怎么办?
      

  18.   

    我的意思是你为了显示效果要Sleep
    但你的线程是执行的啊
    如果你抓了网页存放或做不显示的处理就不用Sleep
    用Join
    tb.Start();
    ta.Start();
    后加
    ta.Join();
    tb.Join();
      

  19.   

    还可用(等1秒)
    tb.Start();
    ta.Start();
    if(!ta.Join(1000))
    {
    //不成功时的处理
    }if(!tb.Jain(1000))
    {
    //不成功时的处理
    }
      

  20.   

    用Join
    tb.Start();
    ta.Start();
    后加
    ta.Join();
    tb.Join();
    这样主线程就会等子线程执行完后执行!!
      

  21.   

    楼上的哥们,用join和sleep方法我用过,但是用join是不是其它线程都要等这个线程运行完才能运行啊?我的本意是想两个线程一起运行?是我对join理解错误吗?如果是,请解释一下。谢谢.另外,为什么winform就不用sleeep或join就能显示,而webform就不行呢?
    是winform比webform快的原因吗?
      

  22.   

    join是当前线程(执行Join命令的程序)等待join指向的线程运行完

    ta,tb在同时运行,Button1_Click等着
      

  23.   

    join的用法不是:让其它线程都等着吗?还有,如果用sleep,那么sleep(?)多少呢?我想不能是个固定的数吧。如果我要抓的网页中的某一个出了问题,超出了sleep 的时间,那都不会显示的,对吗?所以我才想用个什么回调之类的,等两个线程都工作完了,告诉主线程一下,然后再显示。这样思路对吗?
      

  24.   

    Webform中运行在服务器,显示在客户端,如果不停,由于主线程已完,已送客户端,附加线程想回调也没机会显示了