尝试使用OAC在.netCF上显示在另一个(后台)线程中创建的表单时出现异常

时间:2011-02-18 15:40:41

标签: multithreading windows-mobile compact-framework

在多表单.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()

我对这里出了什么问题一无所知。任何人都可以帮助我吗?

或者有更好的方法在后台加载表单吗?

如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

您无法在后台线程中创建表单(或安全地对控件或表单进行任何操作)。它们需要在运行消息泵的同一个线程上创建 - 它就像Windows窗体的工作方式一样。

创建表单本身不应该是一项昂贵的任务。我的建议是执行在后台线程中显示表单所需的任何昂贵的计算,然后将这些计算的结果传递回主消息泵,以便创建和显示表单本身。

(写这篇文章的一半我意识到这个问题是关于windows mobile的,不过我99%肯定上述情况仍适用于这种情况)