C#线程的sleep问题

猫侠 2013-05-30 10:47:49
需求是这样的,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();
}
}
}
}
...全文
550 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
猫侠 2013-06-03
  • 打赏
  • 举报
回复
问题已解决,在UI界面下建立多个线程,其中一个线程为主线程,在主线程内运行其他线程
人生导师 2013-05-30
  • 打赏
  • 举报
回复
你不需要使用创建线程去执行这样的目的了,你可以使用Task类完成,把方法的执行都用Task这个类去执行,关于Task的使用可以参考下面: http://msdn.microsoft.com/zh-cn/library/vstudio/dd321321.aspx 你可以使用一个委托(即要执行的显示文本的方法)初始化一个Task对象,然后调用Task.Run方法,然后再调用Wait方法等待一段时间,此时不会堵塞UI线程的,但是会堵塞线程池线程,等待一段时间之后再调用Task.ContinueWith方法来执行另外一个方法,即显示视频,显示图片的过程也是一样的
lr5420511 2013-05-30
  • 打赏
  • 举报
回复
你的这类代码有问题,举一个例子吧 Thread t2 = new Thread(showchartex_task);//处理文本的线程 t2.Start(); Thread.Sleep(10000); label1.Visible = false;//隐藏文本 t2线程start以后你立马让UI线程睡大觉去了,这段睡大觉的时间里,t2线程可能需要通知UI线程更新UI界面,等他Thread.Sleep(10000);以后,你又告诉需要更新的label控件:我不需要你了,该干嘛干嘛去!

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧