需求是这样的,winform程序,轮播文本、视频、图片,播放文本时暂停5秒,接着播放视频,视频播放完成后,播放图片。如果在winformUI界面中编写所有代码,thread.sleep将会影响文本、视频、图片的显示
如果文本、视频、图片分别使用线程,又有很多意想不到的问题winform程序主窗体内有一个picturebox,一个Label,一个mediaplay播放器下面程序不能如预想的那样,顺序播放,顺序隐藏,求高手指点    //锁住主程序
    lock (obj_main_main)
    {
//屏幕对应的节目元素列表
List<MODEL.PROGRAMELEModel> modelList = comm.programEleModel("P1"); for (int jj = 0; jj < modelList.Count; jj++)
{
    //锁住循环内程序
    lock (obj_main)
    {
if (modelList[jj]._eletype.Equals("1"))
{
    //不为空播放文本
    if (!modelList[jj]._chartextmodel._content.Trim().Equals(""))
    {
Thread t2 = new Thread(showchartex_task);//处理文本的线程
t2.Start();
Thread.Sleep(10000);
label1.Visible = false;//隐藏文本
    }
} //判断是否视频
if (modelList[jj]._eletype.Equals("2"))
{
    //pictureBox1.Controls.Clear();
    //不为空播放视频
    if (!modelList[jj].filepath.Trim().Equals(""))
    {
Thread t2 = new Thread(showvideo_task);//处理视频的线程
t2.Start();
Thread.Sleep(10000);
axWindowsMediaPlayer1.Width = 300;//隐藏线程
    }
} //判断是否图片
if (modelList[jj]._eletype.Equals("3"))
{
    Thread t2 = new Thread(showpic_task);//处理图片的线程,将生成的图片add进pictureBox中
    t2.Start();
    Thread.Sleep(10000);
    pictureBox1.Controls.Clear();
    pictureBox1.Refresh();
}
    }
}
    }

解决方案 »

  1.   

    你不需要使用创建线程去执行这样的目的了,你可以使用Task类完成,把方法的执行都用Task这个类去执行,关于Task的使用可以参考下面:
    http://msdn.microsoft.com/zh-cn/library/vstudio/dd321321.aspx
    你可以使用一个委托(即要执行的显示文本的方法)初始化一个Task对象,然后调用Task.Run方法,然后再调用Wait方法等待一段时间,此时不会堵塞UI线程的,但是会堵塞线程池线程,等待一段时间之后再调用Task.ContinueWith方法来执行另外一个方法,即显示视频,显示图片的过程也是一样的
      

  2.   

    你的这类代码有问题,举一个例子吧
    Thread t2 = new Thread(showchartex_task);//处理文本的线程
    t2.Start();
    Thread.Sleep(10000);
    label1.Visible = false;//隐藏文本t2线程start以后你立马让UI线程睡大觉去了,这段睡大觉的时间里,t2线程可能需要通知UI线程更新UI界面,等他Thread.Sleep(10000);以后,你又告诉需要更新的label控件:我不需要你了,该干嘛干嘛去!