BackgroundWorker和COM Interop - 在Win2k8上崩溃

时间:2014-03-07 02:23:37

标签: c# .net-4.0 com windows-server-2008

我在使用调用第三方COM Interop包装器中的方法的BackgroundWorker时遇到问题。 COM方法运行一段时间,我需要向UI提供反馈。 COM方法确实提供了我可以使用的回调。

我这样称呼我的方法;

VariableUpdater updater = new VariableUpdater(variablesToUpdate);
updater.ProcessFiles();

在ProcessFiles中,我启动了我的背景工作者;

public void ProcessFiles()
{
    m_worker.RunWorkerAsync();
}  

哪个;

private void m_worker_DoWork(object sender, DoWorkEventArgs e)
{   
    UpdateVariables();    
}

public bool UpdateVariables()
{
    IEdmBatchUpdate2 update = this.Vault.CreateUtility(EdmUtility.EdmUtil_BatchUpdate) as IEdmBatchUpdate2;
    for (int i = 0; i < foundExcelRows.Count(); i++)
    {
            // bunch of code                
            update.SetVar(importFile.FileID, variable.DestinationVarID, ref value, defaultConfig, 0);
    }
    Array errors = Array.CreateInstance(typeof(EdmBatchError), 0);
    try
    {
        update.CommitUpdate(out errors, null); // COM Call -> Crashes here
        return true;
    }
    catch (Exception ex)
    {
            log.Error("update error", ex);
        return false;
    }
}

现在这里是踢球者;这一切都在Win7,Windows 2008 R2和Windows 2k12上运行得非常好。它仅在Win2k8上与c0000374崩溃,包括SP1和SP2。如果我从UI线程创建并调用IEmdBatchUpdate2.CommitUpdate(),代码运行正常。

我也试着无济于事;

Thread asyncThread = new Thread(new ThreadStart(updater.ProcessFiles));
asyncThread.SetApartmentState(ApartmentState.STA);
asyncThread.Start();

我已经坚持了几天,在我添加另一个进行更新的过程之前,我想知道是否有人有任何想法。

这是错误;

Problem Event Name: APPCRASH
Application Name:   CEMigrationTool.exe
Application Version:    1.5.1.2
Application Timestamp:  531933ad
Fault Module Name:  StackHash_2d26
Fault Module Version:   6.0.6002.18881
Fault Module Timestamp: 51da3e00
Exception Code: c0000374
Exception Offset:   000abc4f
OS Version: 6.0.6002.2.2.0.272.7
Locale ID:  1033

1 个答案:

答案 0 :(得分:0)

也许您应该尝试捕获可以像这样抛出的所有异常并尝试重试任何失败的尝试:

public bool UpdateVariables()
{
    try
    {
        IEdmBatchUpdate2 update = this.Vault.CreateUtility(EdmUtility.EdmUtil_BatchUpdate) as IEdmBatchUpdate2;

        for (int i = 0; i < foundExcelRows.Count(); i++)
        {
                // bunch of code                
                update.SetVar(importFile.FileID, variable.DestinationVarID, ref value, defaultConfig, 0);
        }
        Array errors = Array.CreateInstance(typeof(EdmBatchError), 0);

        update.CommitUpdate(out errors, null); // COM Call -> Crashes here
        return true;
    }
    catch (Exception ex)
    {
            log.Error("update error", ex);
        return false;
    }
}

修改

如果您无法捕获异常,请尝试查看本文

Preventing Exceptions from 3rd party component from crashing the entire application