关于一个线程的问题

ajdkjalj 2020-03-01 03:53:02
这个是用线程弹出窗口的方法,splashFormType是传入的窗口名

private static object _obj = new object();

private static Form _SplashForm = null;

private static Thread _SplashThread = null;

private delegate void ChangeFormTextdelegate(string s);
public static void Show(Type splashFormType)
{
if (_SplashThread != null)
return;
if (splashFormType == null)
{
throw (new Exception());
}

_SplashThread = new Thread(new ThreadStart(delegate()
{
CreateInstance(splashFormType);
Application.Run(_SplashForm);
}));

_SplashThread.IsBackground = true;
_SplashThread.SetApartmentState(ApartmentState.STA);
_SplashThread.Start();
}

下面是创建的单例

private static void CreateInstance(Type FormType)
{
if (_SplashForm == null)
{
lock (_obj)
{
object obj = FormType.InvokeMember(null,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
_SplashForm = obj as Form;
_SplashForm.TopMost = true;
_SplashForm.ShowInTaskbar = false;
_SplashForm.BringToFront();
_SplashForm.StartPosition = FormStartPosition.CenterScreen;
if (_SplashForm == null)
{
throw (new Exception());
}
}
}
}

下面是关闭窗口的方法

public static void Close()
{
if (_SplashThread == null || _SplashForm == null) return;

try
{
_SplashForm.Invoke(new MethodInvoker(_SplashForm.Close));
}
catch (Exception)
{
}
_SplashThread = null;
_SplashForm = null;
}

现在我的问题是先进行show后,因为异常要执行close方法,进入close方法时,_SplashForm还没有创建,所以没关掉,结果就是窗口还是打开的,是哪里的问题
...全文
109 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lindexi_gd 2020-03-01
  • 打赏
  • 举报
回复
解决方法是在 Application.Run(_SplashForm); 之前添加一个 lock 同时在 Close 方法里面也添加 lock 这样在开始运行之前就能进入锁,当然还需要一个 bool 字段表示当前是否进入开启或关闭,在 lock 里面第一句做判断,在打开关闭方法lock第一句设置值

110,539

社区成员

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

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

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