首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死

2013-11-06 
【求助】如何在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死需求如下:有一个Form类:UI

【求助】如何在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死
需求如下:
有一个Form类:UI(主线程)
一个Thread类:ThreadA

现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的代码部分,同时这个时候UI界面不能够挂死

读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=

试过ThreadA.join(),这个会让界面挂死,不行的
其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法

求各位大神支招Orz 怎么在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死
[解决办法]

引用:
需求如下:
有一个Form类:UI(主线程)
一个Thread类:ThreadA

现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的代码部分,同时这个时候UI界面不能够挂死

读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=

试过ThreadA.join(),这个会让界面挂死,不行的
其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法

求各位大神支招Orz

需求很简单啊。
你在主线程里通过异步的方式调用你要执行的方法,然后再回调函数里通知主线程已经完成。
我这里有一个方法,通过委托的方式,执行指定方法,可以设置等待时间,等待时间结束后,强制结束。就相当于超时控制。
要执行的方法是异步的,不会影响主线程,而且还可以控制超时时间。
using System; 


using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace PMS.CommonLib
{
    public delegate void DoHandler();

    public class ComReadTimeout
    {
        private ManualResetEvent mTimeoutObject;
        //标记变量
        private bool mBoTimeout;
        public DoHandler Do;
        public ComReadTimeout()
        {
            //  初始状态为 停止
            this.mTimeoutObject = new ManualResetEvent(true);
        }
        ///<summary>
        /// 指定超时时间 异步执行某个方法
        ///</summary>
        ///<returns>执行 是否超时</returns>
        public bool DoWithTimeout(TimeSpan timeSpan)
        {
            if (this.Do == null)
            {
                return false;
            }
            this.mTimeoutObject.Reset();
            this.mBoTimeout = false; //标记
            this.Do.BeginInvoke(DoAsyncCallBack, null);
            // 等待 信号Set
            if (!this.mTimeoutObject.WaitOne(timeSpan, false))
            {
                this.mBoTimeout = false;
            }
            return !this.mBoTimeout;
        }
        ///<summary>
        /// 异步委托 回调函数
        ///</summary>
        ///<param name="result"></param>
        private void DoAsyncCallBack(IAsyncResult result)
        {
            try
            {
                this.Do.EndInvoke(result);
                // 指示方法的执行未超时
                this.mBoTimeout = true;
            }
            catch (Exception ex)
            {
                this.mBoTimeout = false;
            }
            finally
            {
                this.mTimeoutObject.Set();
            }
        }
    }
}


用法:
    //定义
    comReadTimeout = new PMS.CommonLib.ComReadTimeout();
    //设置委托方法。
    comReadTimeout.Do = ReadComData;
   //用法ConstMdl.iReadComTimeout 超时毫秒数
  bool isTimeout = comReadTimeout.DoWithTimeout(new TimeSpan(0, 0, 0, 0, ConstMdl.iReadComTimeout));





[解决办法]
BackgroundWorker 
[解决办法]
将UI代码放入委托.委托中使用invoke,将委托放入线程方法退出前.
[解决办法]
用await试试

http://msdn.microsoft.com/zh-cn/library/vstudio/hh156528.aspx
[解决办法]
引用:
现在能想到的最好的方法是等A线程执行结束了以后发给消息给主线程,然后主线程开始调用接下来的函数。
但这个我不知道代码怎么实现。。。


这个思路可以的,
1、在线程中设置一个事件,子线程运行完后,触发这个事件.事件的处理用委托。
2、在主线程订阅上述事件,平且写事件处理函数。

具体代码,请MSDN中搜索(利用事件类之间数据传递),有一个闹钟的范例!!借鉴下很容易解决的!!
[解决办法]
引用:
UI又要等,又不想挂起,那只能是做DoEvent
不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了

DoEvent我试过,不是很好,“通知UI刷新”用事件?
[解决办法]
我觉得用异步回调就可以了,线程那个结束后调用后面需要处理的方法

热点排行