读书人

怎么在UI界面中等待另一个线程结束后再

发布时间: 2013-11-06 16:26:37 作者: rapoo

【求助】如何在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刷新”用事件?
[解决办法]
我觉得用异步回调就可以了,线程那个结束后调用后面需要处理的方法

读书人网 >C#

热点推荐