Bij de ontwikkeling van een outlookplugin loop ik tegen het probleem aan dat een async button event handler na een await niet verder gaat op de UI-thread:
Als ik een en ander toepas in een normale winforms app is er geen vuiltje aan de lucht, maar als vsto plugin knalt hij eruit bij het resetten van de statustext, omdat de control niet benaderd wordt vanuit de juiste thread. Volgens de documentatie van Microsoft zou de suspended methode na een await moeten doorgaan op de oorspronkelijke thread, maar blijkbaar gaat dat niet op voor een outlook plugin. Uiteraard zou ik de rest van de eventhandler apart kunnen zetten met een invoke() ervoor, maar dat voelt als een noodverband. Wat gebeurt hier en hoe is dat het beste op te lossen?
Relevante software en hardware die ik gebruik
Visual Studio community, .net 4.7.
Wat ik al gevonden of geprobeerd heb
Eindeloos MSDN gelezen, maar daar word ik voor dit specifieke geval niet veel wijzer van.
en lopen prutsen met synchronisation contexts, zonder soelaas.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| private async void cmdDoit_ClickAsync(object sender, EventArgs e) { //wat voorbereiding waaronder aanpassen van de stausbalk this.statusText.Text = "Agenda openen... moment geduld aub"; specification s = new specification(); s.CollectAsync(); await s.CollectAsync(); //opruimen en diverse vervolgstappen in de ui this.statusText.Text = "Gereed"; } class specification { public async Task CollectAsync() { //timeconsuming io work await Task.Delay(5000); } } |
Als ik een en ander toepas in een normale winforms app is er geen vuiltje aan de lucht, maar als vsto plugin knalt hij eruit bij het resetten van de statustext, omdat de control niet benaderd wordt vanuit de juiste thread. Volgens de documentatie van Microsoft zou de suspended methode na een await moeten doorgaan op de oorspronkelijke thread, maar blijkbaar gaat dat niet op voor een outlook plugin. Uiteraard zou ik de rest van de eventhandler apart kunnen zetten met een invoke() ervoor, maar dat voelt als een noodverband. Wat gebeurt hier en hoe is dat het beste op te lossen?
Relevante software en hardware die ik gebruik
Visual Studio community, .net 4.7.
Wat ik al gevonden of geprobeerd heb
Eindeloos MSDN gelezen, maar daar word ik voor dit specifieke geval niet veel wijzer van.
De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland