Исключение при попытке показать форму, созданную в другом (фоновом) потоке на .netCF с OAC - PullRequest
0 голосов
/ 18 февраля 2011

В мультиформном приложении .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 Ответ

2 голосов
/ 18 февраля 2011

Вы не можете создавать формы (или безопасно выполнять какие-либо манипуляции с элементами управления или формами) в фоновых потоках.Они должны быть созданы в том же потоке, в котором работает насос сообщений - это просто способ работы Windows Forms.

Создание самой формы не должно быть само по себе дорогостоящей задачей.Я бы посоветовал выполнить любые дорогостоящие вычисления, необходимые для отображения формы в фоновом потоке, а затем передать результат этих вычислений обратно в основной насос сообщений, чтобы создать и отобразить саму форму.

(На полпути, написав это, я понял, что этот вопрос касается Windows Mobile, однако я на 99% уверен, что вышеизложенное все еще применимо в этой ситуации)

...