当前位置:编程学习 > C#/ASP.NET >>

求助 事件控制线程问题

求事件控制线程的例子,要能用按钮触发事件(Event)控制暂停,恢复,退出,thread.Suspend()/thread.Resume()这种不要
因为Event.WaitOne()是挂起当前线程,怎么通过事件让指定的线程执行这个从而达到暂停效果
试了Dispatcher.invoke老死锁,BeginInvoke么怎么也跑不进去

public class AA
    {
        public delegate void StatusChangedEventHandler(object sender, StatusEventArgs e);
        public event StatusChangedEventHandler OnStatusChanged;
        public void ChangeStatus(ThreadStatus s)
        {
            if (OnStatusChanged != null)
                OnStatusChanged(this, new StatusEventArgs(s));
        }
    }

public void DoWork()
        {
            dper = Dispatcher.CurrentDispatcher;
            aa.OnStatusChanged += ThreadPause;
            for (int i = 0; i < 20;i++ )
            {
                string s = string.Format("ThreadID:{0} Add i:{1}", Thread.CurrentThread.ManagedThreadId.ToString(), i.ToString());
                if (this.listBox1.InvokeRequired)
                {
                    this.listBox1.Invoke(new MethodInvoker(() => { this.listBox1.Items.Add(s); }));
                }
                else
                {
                    this.listBox1.Items.Add(s);
                }
                Thread.Sleep(1000);
            }
        }
 public void ThreadPause(object sender, StatusEventArgs e)
        {
            Console.WriteLine(string.Format("ThreadPause Thread id:{0}", Thread.CurrentThread.ManagedThreadId));
            if (e.status == ThreadStatus.Pause)
            {
                dper.BeginInvoke(new MethodInvoker(() =>
                {
                    Console.WriteLine(string.Format("CurrentDispatcher Thread id:{0}"), Thread.CurrentThread.ManagedThreadId);
                    mEvent.WaitOne();
                }),null);
            }
}
 private void btnPause_Click(object sender, EventArgs e)
        {
            aa.ChangeStatus(ThreadStatus.Pause);
        }
线程 事件 --------------------编程问答-------------------- 我这有个比较笨的方法
public volatile int a=0;

//线程
void t()
{
while(a!=3) //==3退出 
......
while(a==2) //==2暂停
{
sleep(100);
}
//正常代码
}


//button 代码
button(...)
{
if(a==2)
{
a=1;
}
else
{
a=2;
}
//要退出就a=3;
}
另外注意下使用寄存器变量控制线程由于寄存器的特殊性有极小的概率会出错,具体自己百度 --------------------编程问答-------------------- 谢谢LS帮顶
这边线程里没有循环的实际
是有很多事要做,这里写了for只是为了模拟,没办法判断,总不能没执行一个语句判断下吧... --------------------编程问答--------------------
怎么老没人回答我的问题...真悲剧
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,