在多表单.NetCF 3.5应用程序中,我正在尝试在用户使用上一个表单时在后台创建表单。 我们在项目中使用Orientation Aware Control
我们使用包装类(FormController
)(如果我使用了错误的术语,请告诉我)在我们的应用程序中保留对不同表单的静态引用。因为我们只想创建一次。
目前,在第一次使用表单时创建表单。但由于这是一项耗时的操作,我们希望在用户
的背景下执行此操作Application.Run(new FormController.StartUI());
class FormController{
private static object lockObj = new object();
private static bool secIsLoaded = false;
private static StartForm startForm = new StartForm();
private static SecForm m_SecForm;
static SecForm FormWorkOrderList
{
get
{
CreateSecForm();
return m_SecForm;
}
}
private static void StartUI(){
startForm.Show();
ThreadStart tsSecForm = CreateSecForm;
Thread trSecForm = new Thread(tsSecForm);
trSecForm.Priority = ThreadPriority.BelowNormal;
trSecForm.IsBackground = true;
trSecForm.Start();
return startForm;
}
private static void CreateSecForm()
{
Monitor.Enter(lockObj);
if(!secIsLoaded){
m_SecForm = new SecForm();
secIsLoaded = true;
}
Monitor.Exit(lockObj);
}
private static void GotoSecForm()
{
SecForm.Show();
StartForm.Hide();
}
当我调用GotoSecForm()
时,程序会在SecForm.Show()
上使用hResult:2146233067执行一个除外,并且没有其他有价值的信息。
异常的堆栈跟踪是:
on Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
on System.Windows.Forms.Control.SuspendLayout()
on b..ctor(OrientationAwareControl control)
on Clarius.UI.OrientationAwareControl.ApplyResources(CultureInfo cultureInfo, Boolean skipThis)
on Clarius.UI.OrientationAwareControl.ApplyResources()
on Clarius.UI.OrientationAwareControl.OnLoad(EventArgs e)
on Clarius.UI.OrientationAwareControl.c(Object , EventArgs )
on System.Windows.Forms.Form.OnLoad(EventArgs e)
on System.Windows.Forms.Form._SetVisibleNotify(Boolean fVis)
on System.Windows.Forms.Control.set_Visible(Boolean value)
on System.Windows.Forms.Control.Show()
我对这里出了什么问题一无所知。任何人都可以帮助我吗?
或者有更好的方法在后台加载表单吗?
如果需要更多信息,请与我们联系。
答案 0 :(得分:2)
您无法在后台线程中创建表单(或安全地对控件或表单进行任何操作)。它们需要在运行消息泵的同一个线程上创建 - 它就像Windows窗体的工作方式一样。
创建表单本身不应该是一项昂贵的任务。我的建议是执行在后台线程中显示表单所需的任何昂贵的计算,然后将这些计算的结果传递回主消息泵,以便创建和显示表单本身。
(写这篇文章的一半我意识到这个问题是关于windows mobile的,不过我99%肯定上述情况仍适用于这种情况)