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

异步线程,loading窗体解决思路

2012-06-09 
异步线程,loading窗体代码入下C# codepublic class WaitForm:IDisposable{private WaitingForm wf//一个

异步线程,loading窗体
代码入下

C# code
public class WaitForm:IDisposable{   private WaitingForm wf;//一个窗体   private Thread myThread;   public WaitForm()   {      myThread = new Thread((ThreadStart)delegate{ wf = new WaitingForm();Application.Run(wf); });   }   void IDisposalle.Dispose()   {     if(wf!=null)     wf.Invoke((EventHandler)delegate{wf.Close();});   }}


//另一个类的调用
C# code
using(WaitForm ww = new WaitForm()){   for(int i=0;i<999999;i++)    {}}

问题是当我把999999变为100的时候问题就来了 里面太快了 Dispose 的时候 wf为空
不知道 怎么办好了 有时候 就会关不掉等待窗体 试过在Dispose方法中加入 Thread.Sleep(20)
用小例子调试还行 放到我的大型应用程序中就失效了。
DevExpress.Utils.WaitDialogForm 
的效果不错 不知道它怎么搞的 好像是画出来的
分不多 求达人帮忙

[解决办法]
调用了Dispose就不应该再使用这个对象(实例)了,当然也包括实例成员wf
设计上有问题,在WaitForm中定义委托
[解决办法]
public class WaitForm : IDisposable
{
private WaitingForm wf;//一个窗体
private Thread myThread;

private object lockWf = new object();
public WaitForm()
{
myThread = new Thread((ThreadStart)delegate
{
lock (lockWf)
{
wf = new WaitingForm();
}
wf.ShowDialog();
});
myThread.Start();
}

#region IDisposable 成员

void IDisposable.Dispose()
{
lock (lockWf)
{
if (wf != null)
{
while (!wf.InvokeRequired)
{
Thread.Sleep(10);
}

wf.Invoke((EventHandler)delegate { wf.Close(); });
}
else
{
myThread.Abort();
}
}
}

#endregion
}

热点排行