Hintergrund RunworkerCompleted Event feuert nicht auf VSTA_Main Thread: Excel VSTO Addin - c #, Multithreading, vsto, Hintergrundarbeiter, Synchronisationskontext

I"m working on a VSTO-addin for excel where i"ve einen Hintergrund-Arbeiter eingesetzt, um eine Aufgabe zu erledigen. Ich muss einige Inhalte auf dem Blatt aktualisieren, sobald der Hintergrundarbeiter die Ausführung abgeschlossen hat. Ich benutze Hintergrund RunworkerCompleted Event, um diese Aufgabe zu erledigen, sobald der Hintergrundarbeiter mit seiner Aufgabe fertig ist. Nach den Posts:

it is mentioned that Background RunworkerCompleted Event wird auf dem UI-Thread ausgelöst, wenn der BackgroundWorker auf dem UI-Thread erstellt wurde. Ich habe meinen Hintergrund-Worker auf dem VSTA_Main-Thread bereitgestellt, der von dem Add-In bereitgestellt wird, aber das zugeordnete Hintergrund-RunworkerCompleted-Ereignis wird auf einem beliebigen Worker-Thread ausgelöst. Ich habe folgende Zweifel bezüglich dieses Problems:

  1. Unterscheidet sich der VSTA_Main-Thread vom UI-Thread von Excel? (Ich denke es ist, aber ich wollte nur bestätigen)

  2. Wie kann ich die Thread-Bereitstellung mithilfe von verwalten? Synchronisationskontext (oder jeder andere mögliche Ansatz), so dass das Hintergrund-RunworkerCompleted-Ereignis auf den gewünschten Thread ausgelöst wird.

Der vereinfachte Code in meinem Fall sieht in etwa so aus:

// This code piece executes on VSTA_Main thread

private BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
backgroundWorker.RunWorkerAsync();


// This code piece executes on some random worker thread - Assume Thread 1

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// It simulates some task
Thread.sleep(100)
}


// This event is raised on a random worker thread - Not Thread 1 and not VSTA_Main

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// perform some sheet update operations
}

Ich arbeite derzeit an Microsoft Visual Studio 2010 und Microsoft Excel 2007.

Antworten:

0 für die Antwort № 1
  1. Unterscheidet sich der VSTA_Main-Thread vom UI-Thread von Excel? (Ich denke es ist, aber ich wollte nur bestätigen)

Da bin ich mir nicht sicher (ich habe diese Frage durch Googeln gefunden VSTA_Main) aber von meinem Verständnis aus muss der Zugriff auf UI-Elemente in einem VSTO-Addin erfolgen VSTA_Main Faden.

  1. Wie kann ich die Thread-Bereitstellung mithilfe von Synchronisationskontext (oder einem anderen möglichen Ansatz) verwalten, sodass das Hintergrund-RunworkerCompleted-Ereignis für den gewünschten Thread ausgelöst wird?

Es scheint ein Fehler in VSTO zu sein, hier ist ein Workaround: BackgroundWorker funktioniert nicht in VSTO.


Speisekarte