http://expert.csdn.net/Expert/topic/2767/2767041.xml?temp=.4337427
看得不是太明白

解决方案 »

  1.   

    就是把你生成新窗口的语句从你的监听线程里独立出来,重开个生成新窗口线程,因为你监听线程用的while(true),这个线程会阻在那里的
      

  2.   

    终于解决了,现在改成了
    st.Join(100);
    //滚动
    if (pw.IndexOf("1") != -1 && ConfigurationSettings.AppSettings["ScrollBar"] == "y")
    {
    if (body.Length >80)
    {
    strmsg = title + "  " + body.Substring(0,70) + "......";
    }
    else
    {
    strmsg = title + "  " + body;
    }
    Thread shscr = new Thread(new ThreadStart(showscroll));
    shscr.IsBackground = true;
    shscr.Start();
    }
    //气球
    if (pw.IndexOf("2") != -1 && ConfigurationSettings.AppSettings["Balloon"] == "y")
    {
    Thread shscr = new Thread(new ThreadStart(showballoon));
    shscr.IsBackground = true;
    shscr.Start();
    }
    //窗体
    if (pw.IndexOf("3") != -1 && ConfigurationSettings.AppSettings["PopForm"] == "y")
    {
    Thread shscr = new Thread(new ThreadStart(showform));
    shscr.IsBackground = true;
    shscr.Start();
    }st.Join(100);这一句作为实时监听会不会引起什么问题,如信息丢失?
      

  3.   

    KentYu(恳鱼) 可否写部份代码出来最好应该怎样做,因为本人对线程不太熟悉
      

  4.   

    楼主:你把st.join(100)注释掉,窗体还会死的吗?
      

  5.   

    如果要等待线程的话,用Mutex更好啊!sleep不能够保证
      

  6.   

    st.Join(100);
    //滚动
    if (pw.IndexOf("1") != -1 && ConfigurationSettings.AppSettings["ScrollBar"] == "y")
    {
    if (body.Length >80)
    {
    strmsg = title + "  " + body.Substring(0,70) + "......";
    }
    else
    {
    strmsg = title + "  " + body;
    }
    Thread shscr = new Thread(new ThreadStart(showscroll));
    shscr.IsBackground = true;
    shscr.Start();
    }
    //气球
    if (pw.IndexOf("2") != -1 && ConfigurationSettings.AppSettings["Balloon"] == "y")
    {
    Thread shscr = new Thread(new ThreadStart(showballoon));
    shscr.IsBackground = true;
    shscr.Start();
    }
    //窗体
    if (pw.IndexOf("3") != -1 && ConfigurationSettings.AppSettings["PopForm"] == "y")
    {
    Thread shscr = new Thread(new ThreadStart(showform));
    shscr.IsBackground = true;
    shscr.Start();
    }st.Join(100);
      

  7.   

    To:sunruping(圣诞老人) 
    最后没有再加st.Join(100)也没问题
    To:KentYu(恳鱼)
    把st.Join(100)注释掉就会死在打开窗体那其实我加了st.Join(100)后问题是解决了,但由于本人对线程不熟悉,不知这样做效果如何,是否还有更好的做法!
      

  8.   

    例子代码如下:
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;using System.Threading;namespace FormTest
    {
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    private Thread myThread;
    private delegate void OpenNewFormHandler();
    private event OpenNewFormHandler openNewForm;
    private System.ComponentModel.Container components = null; public Form1()
    {
    InitializeComponent();
    myThread = new Thread(new ThreadStart(RunThread));
    this.openNewForm += new OpenNewFormHandler(Form1_openNewForm);
    myThread.Start();
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    } #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    // 
    // Form1
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(396, 221);
    this.Name = "Form1";
    this.Text = "Form1"; }
    #endregion
    private void RunThread()
    {
    string vvv;
    for(int i=0;i<10;i++)
    {
    vvv = i.ToString();
    }
    if(openNewForm!=null)
    {
    openNewForm();
    }
    } private void Form1_openNewForm()
    {
    Form2 form2 = new Form2();
    form2.ShowDialog();
    }
    }
    }
      

  9.   

    楼上说的不错,对于线程中对窗口或界面的操作,我也一般用delegate委托完成的
      

  10.   

    private delegate void RemindHandler();
    private event RemindHandler remind; public Form1()
    { InitializeComponent(); rduc = new UdpClient(5001);
        rmipep = null; showicon();
    //startreceive();
    st = new Thread(new ThreadStart(startreceive));
    st.Start(); } /// <summary>
    /// 接收UDP信息
    /// </summary>
    private  void Receive()
    { try
    {
    while(true)
    {
    XmlSerializer msgser = new XmlSerializer(typeof(MsgDetails));
    MemoryStream stream = new MemoryStream(); byte[] rcbyte = rduc.Receive(ref rmipep);

    stream.Write(rcbyte,0,rcbyte.Length);
    stream.Position=0; md = (MsgDetails)msgser.Deserialize(stream);
    title = md.MsgTitle;
    body = md.MsgBody;
    msender = md.MsgSender;
    pw = md.PopUpWay;
    remind();

    }
    }
    private void ShowRemind()
    {
    if (pw.IndexOf("1") != -1 && ConfigurationSettings.AppSettings["ScrollBar"] == "y")
    {
    strmsg = "主题:" +title + "  内容:" + body;

    showscroll();

    }
    //气球
    if (pw.IndexOf("2") != -1 && ConfigurationSettings.AppSettings["Balloon"] == "y")
    {
    showballoon();
    }
    //窗体
    if (pw.IndexOf("3") != -1 && ConfigurationSettings.AppSettings["PopForm"] == "y")
    {
    showform();
    }
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }
      

  11.   

    你的 this.remind=new RemindHandler(ShowRemind); 放哪儿了?没放在Form1()里?
      

  12.   

    有放,贴漏了 public Form1()
    { InitializeComponent(); rduc = new UdpClient(5001);
        rmipep = null; showicon(); st = new Thread(new ThreadStart(startreceive));
    this.remind +=new RemindHandler(ShowRemind);
    st.Start(); }
      

  13.   

    private delegate void RemindHandler();
    private event RemindHandler remind1,remind2,remiand3;
    public Form1()
    {  .
       .
       this.remind1=new RemindHandler(showscroll);
       this.remind2=new RemindHandler(showballoon);
       this.remind3=new RemindHandler(form);
       .
    }private  void Receive()
    { try
    {
    while(true)
    {
    XmlSerializer msgser = new XmlSerializer(typeof(MsgDetails));
    MemoryStream stream = new MemoryStream(); byte[] rcbyte = rduc.Receive(ref rmipep);

    stream.Write(rcbyte,0,rcbyte.Length);
    stream.Position=0; md = (MsgDetails)msgser.Deserialize(stream);
    title = md.MsgTitle;
    body = md.MsgBody;
    msender = md.MsgSender;
    pw = md.PopUpWay;
    ShowRemind();

    }
    }
    private void Remind()
    {
    if (pw.IndexOf("1") != -1 && ConfigurationSettings.AppSettings["ScrollBar"] == "y")
    {
    strmsg = "主题:" +title + "  内容:" + body;

    remind1();

    }
    //气球
    if (pw.IndexOf("2") != -1 && ConfigurationSettings.AppSettings["Balloon"] == "y")
    {
    remind2();
    }
    //窗体
    if (pw.IndexOf("3") != -1 && ConfigurationSettings.AppSettings["PopForm"] == "y")
    {
    remind3();
    }
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }
      

  14.   

    还是一样,线程在接收第一个消息后就中止了
    可否留个MAIL,我把整份代码发过去
      

  15.   

    TO:siugwan(火凤凰)
    给我份瞧瞧吧!
    [email protected]
    谢谢了先!