Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Interop и BackgroundWorker

1.8K
14 июля 2009 года
rSolanov
106 / / 04.05.2005
Здравствуйте!
Обнаружил, что некоторые функции, которые прекрасно работают в основном потоке, а если их вынести в отдельный поток, то они перестают работать. Примером того служит работа Interop с вызовом отчета из MS Access'а:
Код:
Access.Application App = null;
                Access.Dao.Database db = null;
                try
                {
                    object ObjOpt = System.Reflection.Missing.Value;
                    App = new Access.Application();
                    App.OpenCurrentDatabase("\\\\Template\\App.accdb", false, null);
                    Access.Dao.DBEngine dbEngine = new Access.Dao.DBEngine();
                    db = dbEngine.OpenDatabase("\\\\Template\\App.accdb", ObjOpt, false, ObjOpt);
                    db.QueryDefs["Отчет"].SQL = "exec dbo.USP_Rep_Trades_Information \"" + Form.DateParam.ToString("dd.MM.yyyy") + "\"";
                    SaveFileDialog SFD = new SaveFileDialog();
                    SFD.Filter = "Файлы ADOBE PDF (*.pdf)|*.pdf|Все файлы (*.*)|*.*";
                    SFD.FileName = SFD.FileName + "Отчет.pdf";
                    if (SFD.ShowDialog(this) == DialogResult.OK)
                    {
                        Cursor = System.Windows.Forms.Cursors.WaitCursor;
                        App.DoCmd.OutputTo(
                                            Microsoft.Office.Interop.Access.AcOutputObjectType.acOutputReport,
                                            "Отчет",
                                            "PDF",
                                            SFD.FileName,
                                            Form.AutoStart,
                                            ObjOpt,
                                            ObjOpt
                                           );
                    };
                }
                catch (Exception Ex)
                {
                    MessageBox.Show(
                                    this,
                                    Ex.Message,
                                    @"Формирование отчета ""Отчет""",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error
                                    );
                }
                finally
                {
                    if (db != null)
                    {
                        db.Close();
                        db = null;
                    };
                    if (App != null)
                    {
                        App.CloseCurrentDatabase();
                        App = null;
                    };
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    Cursor = System.Windows.Forms.Cursors.Arrow;
                };

При выполнении этого кода отдельным потоком, при использовании BackgroundWorker'а возникает ошибка, скриншот которой представлен во вложении.
Ошибка происходит на строчке:
 
Код:
db = dbEngine.OpenDatabase("\\\\Firewall\\Template\\App.accdb", ObjOpt, false, ObjOpt);

Почему так происходит и возможно ли победить данную проблему?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог