首页 新闻 会员 周边 捐助

WPF中的多线程以及类似MessageBox的代码阻断方式(欢迎大牛们前来指导)

0
悬赏园豆:200 [已解决问题] 解决于 2013-01-04 13:27

红色为主要问题

 

先看代码片断

void Moveing()

{

            //开启一个新的线程运行动画数据
            System.Threading.Thread thread = new System.Threading.Thread(
                    new System.Threading.ThreadStart(UpDateImage));

            

              //如果此处加入  thread.Join() 将导致在子线程中无法更新UI导致死锁   

      

     //此处若加入MessageBox时并不影响thread更新UI,但同时可阻断代码继续运行

              //如何可以实现像MessageBox这种阻止代码运行的方案?

     //MessageBox.Show("Test");

 

             //此处需要等待 A1 处执行完毕才执行,如何实现?

             this.Content = "Done";

}

void UpDateImage()

{

int count =10;//更新次数

//使用一个时间控件每个时间更新UI

 System.Timers.Timer timer = new System.Timers.Timer();
                        timer.Interval = 100;

                        timer.Elapsed += delegate
                        {

                          //此处更新UI需使用主线程

                          this.Dispatcher.Invoke(new Action(
                                   delegate()
                                   {

              //mainImage是一个Image控件
                                       this.mainImage.Source = //将Image的背景更新

                                   }
                                   )
                                   , null);

            count--;

            if(count <=0)

            {

              //A1

              timer.Stop();

            }

         }

}

midnight的主页 midnight | 初学一级 | 园豆:22
提问于:2013-01-04 08:50
< >
分享
最佳答案
1

阻塞主线程的确不是好办法。像一楼说的那样设计也不错啊。。我这边提供一种你想要的效果实现,使用:

Application.DoEvents();
int count = 10;//更新次数
        public Form1()
        {
            InitializeComponent();

        }

        void UpDateImage()
        {


            //使用一个时间控件每个时间更新UI
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 100;
            timer.Elapsed += delegate
            {
                //此处更新UI需使用主线程
                this.BeginInvoke(new Action(
                         delegate()
                         {
                             Thread.SpinWait(1000);
                             //mainImage是一个Image控件
                             this.label1.Text = count.ToString();
                         }
                         )
                         , null);
                System.Threading.Interlocked.Decrement(ref count);
                if (count <= 0)
                {
                    //A1
                    timer.Stop();

                }
            };
            timer.Start();

        }

        private void button1_Click(object sender, EventArgs e)
        {

            System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(UpDateImage));
            thread.Start();




            while (Thread.VolatileRead(ref count) != 0)
            {
                Application.DoEvents();
            }

            this.label1.Text = "456";
        }
收获园豆:200
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-01-04 10:36

在WPF中的

Application.DoEvents();

需要封装一下http://blog.csdn.net/oyi319/article/details/6002488

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-04 11:10
其他回答(3)
0

为什么不直接把:

//此处需要等待 A1 处执行完毕才执行,如何实现?

this.Content = "Done";

放到A1的位置上呢?

I,Robot | 园豆:9783 (大侠五级) | 2013-01-04 09:51
0

可以使用 BackgroundWorker 线程组件。。里面有个属性判断是否执行完毕、、

或者可以用线程池

在 水 一 方 | 园豆:1097 (小虾三级) | 2013-01-04 11:01
0

AutoResetEvent 类 WaitOne,Set 方法 行不行?

geass.. | 园豆:1821 (小虾三级) | 2013-01-04 12:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册