我正在处理一个C#项目,想在单独的窗体中实现“等待”指示符(throbber)。经过大量的研究和试错,似乎建议的方法是使用一个不同于当前窗体/线程的线程加载一个窗体。
我采用这种方法的原因是,最初使用Show()方法在throbber窗体上产生了一个透明的窗体。我不能使用ShowDialog,因为在throbber显示后我需要运行一些代码,并在完成后关闭throbber窗体。
无论如何……尝试许多不同的方法在单独的线程中加载throbber窗体,我仍然会得到一个关于尝试从与创建它的线程不同的线程访问它的错误。这是项目代码的一个框架版本,应该阐明我的问题:
我正在使用的多线程示例是一个受欢迎的链接,用于在单独的线程中创建自己的闪屏界面:http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C
我采用这种方法的原因是,最初使用Show()方法在throbber窗体上产生了一个透明的窗体。我不能使用ShowDialog,因为在throbber显示后我需要运行一些代码,并在完成后关闭throbber窗体。
无论如何……尝试许多不同的方法在单独的线程中加载throbber窗体,我仍然会得到一个关于尝试从与创建它的线程不同的线程访问它的错误。这是项目代码的一个框架版本,应该阐明我的问题:
我正在使用的多线程示例是一个受欢迎的链接,用于在单独的线程中创建自己的闪屏界面:http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C
public class Main
{
public void CheckData()
{
try
{
ProgressBar pb = new ProgressBar();
pb.ShowProgressBar();
//do data checking here
pb.CloseForm()
}
catch(Exception e)
{
}
}
}
public partial class ProgressBar : Form
{
static Thread ms_oThread = null;
public bool shouldStop = false;
static ProgressBar ms_ProgBar = null;
public ProgressBar()
{
InitializeComponent();
//DoWork();
}
public void ShowForm()
{
ms_ProgBar = new ProgressBar();
Application.Run(ms_ProgBar);
}
public void CloseForm()
{
ms_ProgBar.Close();
}
public void ShowProgressBar()
{
// Make sure it is only launched once.
if (ms_ProgBar != null)
return;
ms_oThread = new Thread(new ThreadStart(ShowForm));
ms_oThread.IsBackground = true;
ms_oThread.SetApartmentState(ApartmentState.STA);
ms_oThread.Start();
while (ms_ProgBar == null || ms_ProgBar.IsHandleCreated == false)
{
System.Threading.Thread.Sleep(1000);
}
}
}