Excel Workbook und asynchroner Methodenaufruf

GinoBambino
Hi.

Der folgenden Code verarbeitet ein XmlNode-Objekt und generiert daraus eine Excel-Arbeitsmappe. Die Methode wird asynchron aufgerufen und liefert das Workbook-Objekt als IAsyncResult zurück.

Bei der Übergabe passiert irgendetwas, sodass ich im darauffolgenden Code (nach "EndInvoke") nicht auf fdas Workbook-Objekt zugreifen kann. Die Folge ist eine NullReference-Exception.

Was mache ich hier falsch, sodass es zu dem Fehler kommt?

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
public delegate void DelLoad(XmlNode parentNode);

public delegate Workbook DelegateToBookmark();

     private void Load(XmlNode parentNode)
        {
            if (!this.IsXmlNodeValid(parentNode))
            {
                throw new InvalidOperationException();
            }
            if (parentNode.ChildNodes.Count > 0)
            {
                XmlNode x = parentNode.ChildNodes.Item(0);
                List<XmlNode> equalNodeList = new List<XmlNode>();
                this.MailMergeColumnCollection.Clear();
                
                foreach (XmlNode xNode in parentNode.ChildNodes)
                {
                    if (xNode.ChildNodesEquals(x))
                    {
                        equalNodeList.Add(xNode);
                    }
                    else
                    {
                        throw new ArgumentException();
                    }
                }
                foreach (XmlNode xNode in x.ChildNodes)
                {
                    if (xNode.NodeType == XmlNodeType.Element)
                    {
                        MailMergeColumn c = new MailMergeColumn() { Header = xNode.Name };
                        c.ItemList = new List<string>();
                        this.MailMergeColumnCollection.Add(c);
                    }
                }
                foreach (XmlNode xNode in equalNodeList)
                {
                    for (int i=0; i<xNode.ChildNodes.Count -1; i++)
                    {
                        this.MailMergeColumnCollection[i].ItemList.Add(xNode.ChildNodes.Item(i).InnerText);
                    }
                }
            }
        }

        public Workbook ToWorkbook()
        {
            Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlApp.Visible = false;
            xlApp.ScreenUpdating = false;
            Workbook wb = xlApp.Workbooks.Add();
            ((Worksheet)wb.Worksheets[3]).Delete();
            ((Worksheet)wb.Worksheets[2]).Delete();
            Microsoft.Office.Interop.Excel.Worksheet ws = ((Worksheet)wb.Worksheets[1]);
            int iCol = 1;
            foreach (MailMergeColumn m in this.MailMergeColumnCollection)
            {
                ((Range)ws.Cells[1, iCol]).Value = m.Header;
                int iRow = 2;
                foreach (string item in m.ItemList)
                {
                    ((Range)ws.Cells[iRow, iCol]).Value = item;
                    iRow += 1;
                }
                iCol += 1;
            }
            wb.SaveAs(@"C:\xl.xlsx.");
            return wb;
        }