using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using FastWay.Data;
using DevComponents.DotNetBar.Controls;
using System.Threading;namespace FastWay
{
    public partial class EnterForm : Office2007Form
    {
        public AutoResetEvent WaitLoginEvent = new AutoResetEvent(false);
        public AutoResetEvent WaitCheckNumber = new AutoResetEvent(false);
        public EnterForm()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
            RefreshData();
            cmbTaskType.SelectedIndex = 0;
        }
        public delegate void AppendTextHandler(string msg);
        public delegate int GetCheckIndexHandler();
        public delegate string GetCheckTextHandler();
        private void AppendMessage(string msg)
        {
            if (txtMsgbox.InvokeRequired)
            {
                txtMsgbox.Invoke(new AppendTextHandler(AppendMessage), new object[] { msg });            }
            else
            {
                txtMsgbox.AppendText(msg + "\n");
                Application.DoEvents();
            }
        }
        public string GetCheckNumber()
        {
            if (cmbQList.InvokeRequired) { return (string)cmbQList.Invoke(new GetCheckTextHandler(GetCheckNumber), null); }
            else { return cmbQList.SelectedText; }
        }
        public int GetCheckIndex()
        {
            if (cmbQList.InvokeRequired) { return (int)cmbQList.Invoke(new GetCheckIndexHandler(GetCheckIndex), null); }
            else { return cmbQList.SelectedIndex; }
        }
        /// <summary>
        /// 绑定数据源
        /// </summary>
        public void RefreshData()
        {
            DataTable dataTable = AccountManager.GetNoLockList();
            if (dataTable != null && dataTable.Rows.Count > 0)
            {
                DataRow dr = dataTable.NewRow();
                dr["QNumber"] = string.Empty;
                dataTable.Rows.InsertAt(dr, 0);
            }
            cmbQList.DataSource = dataTable;
            cmbQList.DisplayMember = "QNumber";
        }        private void cbAuto_CheckedChanged(object sender, EventArgs e)
        {
            cmbQList.Enabled = false;
        }        private void btnExcute_Click(object sender, EventArgs e)
        {
            ThreadParameter Parameter = null;
            for (int i = 0; i < 3; i++)
            {
                if (i == 0) { WaitLoginEvent.Set(); }
                WaitLoginEvent.WaitOne();
                Parameter = new ThreadParameter(i + 1);
                Thread currThread = new Thread(new ParameterizedThreadStart(RunWork));
                //currThread.IsBackground = true;
                currThread.Start(Parameter);
            }
        }        public void RunWork(object Parameter)
        {
            WaitLoginEvent.Reset();
            ThreadParameter CurrParameter = Parameter as ThreadParameter;
            AppendMessage("线程:" + CurrParameter.ThreadIndex + "正在等待您选择号码");
            WaitCheckNumber.WaitOne();
            string selNumber = GetCheckNumber();
            AppendMessage(string.Format("线程:{0}_当前选择的号码为:{1}", CurrParameter.ThreadIndex, selNumber));
            RefreshData();
            WaitLoginEvent.Set();
            WaitCheckNumber.Reset();
        }        private void cmbQList_Leave(object sender, EventArgs e)
        {
            string selValue = GetCheckNumber();
            int selIndex = GetCheckIndex();
            if (!string.IsNullOrEmpty(selValue) && selIndex > 0) { WaitCheckNumber.Set(); }
        }
    }
    /// <summary>
    /// 线程参数集
    /// </summary>
    public class ThreadParameter
    {
        public int ThreadIndex { get; set; }
        public string QNumber { get; set; }
        public ThreadParameter(int index) { this.ThreadIndex = index; }
        public ThreadParameter(int index, string qNumber) { this.ThreadIndex = index; this.QNumber = qNumber; }
    }
}思路是想等第一个线程选择号码完成登录后启动第二个线程,但是运行之后发现界面上面的号码选择框无法输入也无法选择,就像界面死掉了一样,求大虾门指点一下。多线程

解决方案 »

  1.   

    if (i == 0) { WaitLoginEvent.Set(); }
                    WaitLoginEvent.WaitOne();
    这句写在UI线程里面肯定会阻塞UI,
    还有这句WaitCheckNumber.WaitOne();后面的代码怎么执行下去来通知WaitLoginEvent继续执行,把这句去掉试一试。
      

  2.   

    AutoResetEvent 是自动事件, Reset()方法没有意义, 调用Set()方法会自动重置为阻塞状态,
    所以btnExecute_Click中的WaitOne 会始终处于阻塞状态,没有return自然就造成UI无法响应了。
    你上面所说的逻辑还是换个思路做吧……