您好我最近在这些方面发布了一个问题,但现在这个问题更具体。因此,我有一个用户需要登录的应用程序。登录过程可能需要一些时间,所以我决定设置一个小动画GIF来表明它正在做某事。听起来很简单...... !! ??
我很快注意到登录过程冻结了动画,所以我想,我会将登录过程放在自己的线程上。我有无数的实例引用UI线程上的对象,所以我想我会尝试反过来并在新线程上显示图像。同样的问题 - 所以我决定创建一个包含图像的新窗口,相应地格式化它并将其显示为新线程!简单!那(有点)工作......我点击登录,动画出现并消失,登录完成。所以Thread变量设置为全局变量:
Friend g_thLoading As Thread
点击“登录”按钮后,我有以下内容:
g_thLoading = New Thread(AddressOf LoginSplashScreen)
g_thLoading.SetApartmentState(ApartmentState.STA)
g_thLoading.IsBackground = True
g_thLoading.Name = "LoginThread"
g_thLoading.Start()
VerifyLogin() 'Process that takes a while...
g_thLoading.Abort()
然后在新线程中调用的方法:
Sub LoginSplashScreen()
Dim SplashScreenWin As New SplashScreen()
Try
SplashScreenWin.ShowDialog()
System.Windows.Threading.Dispatcher.Run()
Catch ex As Exception
SplashScreenWin.Close()
SplashScreenWin = Nothing
End Try
End Sub
这是有效的 - 但如果我不得不多次点击该按钮,则不行。但是,如果(例如)用户输入了错误的凭据,单击登录(上述过程并完成),则会提示他们重新输入 - 再次单击登录按钮...但这次,窗口不显示(但奇怪的是出现在任务栏中)...然后强制关闭应用程序(调试中没有任何内容)。
我确信对话窗口在第一个实例之后正确关闭,因为i)它不再位于任务栏中,其次我对Windows关闭事件进行了一些检查。我相信在第一个实例之后创建的Thread会被关闭,因为我可以看到它从Visual Studio中的Thread Window中删除了......所以 - 我完全失去了。我也尝试了线程上的Join函数,但这只是在进入g_thLoading.Abort()之前挂起进程
我愿意接受有关如何实现我的最终目标的任何建议......无论是扩展我在这里做了什么还是完全是另一个建议。我和背景工作者搞混了,但那里没有多少运气。
答案 0 :(得分:0)
使用BackgroundWorker
类来实现长时间运行的进程。该类允许您指定将在后台线程(在DoWork
事件处理程序中)运行的代码,这些代码将在{{1}中创建BackgroundWorker
的线程的“更新”期间运行事件处理程序,以及在进程完成时运行的代码,再次在ProgressChanged
事件处理程序中创建BackgroundWorker
的线程上。
使用它是这样的:
RunWorkerCompleted
对不起,如果你正在寻找VB.NET,那就是C#,但翻译起来应该不难。