アドインアプリケーションでasync/awaitを使用する際に問題が発生しました。カスタム作業ウィンドウがあり、ユーザーはそこでデータをダウンロードできます。ExcelのExcelイベントが正しくないasync/Excelのアプリケーションレベルのアドイン
待機した操作が完了した後、制御は前の実行コンテキストに戻されません。私はWindowsフォームでサンプルを作成し、同じメソッドを待って貼り付けるとうまくいきます - 操作待ちの後にフォームコントロールを使うことはできますが、アドインではなくカスタムの作業ウィンドウを呼び出す必要がありますInvokeメソッド。簡単な例:私のアドインIで
private void SearchPaneButton_Click(object sender, EventArgs e) { Search(); } private async void Search() { var searchText = SearchTextBox.Text; SearchPaneButton.Text = "Loading…"; var data = await new DataServiceClient().GetDataAsync(searchText); this.Invoke((MethodInvoker)(() => { SearchPaneButton.Text = "Search"; ToggleWorkbookEvents(); })); }
いくつかのイベントを処理する必要がある - ワークシートは、ワークシートアクティブ化/非アクティブ化を変更しましたが、これらのイベントは消えて操作を待って、私のようなものを使用する必要が後に解雇されていませんそれぞれのイベントが使用されるのを待ってから、イベントを "トグル"(remove + add)します。簡単な例:最後のバージョンの.NET Framework(非同期は待つように)
private void ToggleWorkbookEvents() { var excel = Globals.BPNAddIn.Application; //need to ensure event will not be set twice excel.SheetActivate -= CheckSheetForData; excel.SheetActivate += CheckSheetForData; if (excel.ActiveWorkbook != null) { var activeSheet = Globals.BPNAddIn.GetActiveWorksheet(); //need to ensure event will not be set twice activeSheet.Change -= Worksheet_Changed; activeSheet.Change += Worksheet_Changed; } }
ので、多分VSTOフレームワークは、新しい機能をサポートすることはできませんか?
Stackoverflow質問にはコードが関連付けられている必要があります。実際の問題を解決するために詳細を編集してください。 – SpaceSteak
@SpaceSteakいくつかのコード例を追加しました。ありがとうございます –
なぜ '検索 'を待っていませんか? –