日期:2014-05-18  浏览次数:21131 次

异步线程,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
}