Асинхронное выполнение длительной операции в другом AppDomain
От: Shefango  
Дата: 06.06.13 08:57
Оценка:
Доброго времени суток.
Столкнулся с такой проблемой. Мне нужно провести обмен данными с одной системой, предоставляющей только COM-интерфейс. Делаю я это так:

private void startButton_Click(object sender, EventArgs e)
{
    string assembly = Environment.CurrentDirectory + "\\Import.dll";

    if (File.Exists(assembly))
    {
        AppDomain worker = AppDomain.CreateDomain("Worker");

        Thread t = new Thread(() =>
        {
            Trace.WriteLine(AppDomain.CurrentDomain.FriendlyName);
            AbstractImport import = (AbstractImport)worker.CreateInstanceFromAndUnwrap(
                assembly,
                "Import.Import1CtoTS");

            if (import != null)
            {
                import.Initialize(this);
                import.ProgressChanged += new Shared.ProgressChangedEventHandler(import_ProgressChanged);
                import.Start("ts", "Superuser", "123");
            }

            AppDomain.Unload(worker);
        });

        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }
}

При первом нажатии на кнопку startButton код отрабатывает нормально. При повторном нажатии обмен тоже отрабатывает, но при закрытии приложения вываливается AppCrash c исключением 0x0eedfade.
Если этот код вызывать синхронно, так:
private void startButton_Click(object sender, EventArgs e)
{
    string assembly = Environment.CurrentDirectory + "\\Import.dll";

    if (File.Exists(assembly))
    {
        AppDomain worker = AppDomain.CreateDomain("Worker");

        //Thread t = new Thread(() =>
        //{
            Trace.WriteLine(AppDomain.CurrentDomain.FriendlyName);
            AbstractImport import = (AbstractImport)worker.CreateInstanceFromAndUnwrap(
                assembly,
                "Import.Import1CtoTS");

            if (import != null)
            {
                import.Initialize(this);
                import.ProgressChanged += new Shared.ProgressChangedEventHandler(import_ProgressChanged);
                import.Start("ts", "Superuser", "123");
            }

            AppDomain.Unload(worker);
        //});

        //t.SetApartmentState(ApartmentState.STA);
        //t.Start();
    }
}

то импорт, выполняемый многократно без перезапуска приложения отрабатывает нормально и приложение не крэшится при выходе.
Помогите решить проблему с выполнением кода в отдельном потоке.
многопоточность appdomain
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.