2015-09-30 13 views
6

アドインアプリケーションでasync/awaitを使用する際に問題が発生しました。カスタム作業ウィンドウがあり、ユーザーはそこでデータをダウンロードできます。ExcelのExcelイベントが正しくないasync/Excelのアプリケーションレベルのアドイン

  1. 待機した操作が完了した後、制御は前の実行コンテキストに戻されません。私は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(); 
        })); 
    } 
    
  2. いくつかのイベントを処理する必要がある - ワークシートは、ワークシートアクティブ化/非アクティブ化を変更しましたが、これらのイベントは消えて操作を待って、私のようなものを使用する必要が後に解雇されていませんそれぞれのイベントが使用されるのを待ってから、イベントを "トグル"(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フレームワークは、新しい機能をサポートすることはできませんか?

+1

Stackoverflow質問にはコードが関連付けられている必要があります。実際の問題を解決するために詳細を編集してください。 – SpaceSteak

+0

@SpaceSteakいくつかのコード例を追加しました。ありがとうございます –

+0

なぜ '検索 'を待っていませんか? –

答えて

11

これはOfficeプラグインの長年にわたる問題です。これはSynchronizationContextを提供していません。

私のブログで言及したように、これを回避するにはensuring you have a proper SynchronizationContextで対応できます。これは少しハッキーですが、それは動作します:

private async void SearchPaneButton_Click(object sender, EventArgs e) 
{ 
    if (SynchronizationContext.Current == null) 
    SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); 
    await SearchAsync(); 
} 

private async Task SearchAsync() 
{ 
    var searchText = SearchTextBox.Text; 
    SearchPaneButton.Text = "Loading…"; 
    var data = await new DataServiceClient().GetDataAsync(searchText); 
    SearchPaneButton.Text = "Search"; 
    ToggleWorkbookEvents(); 
} 

"トグリングイベント"問題が行く限り、私は分かりません。

+0

なぜそれは少しハッキーだと思いますか? –

+0

ありがとう、私は理解しているように、バックグラウンドワーカーは私の問題を解決していないのですか?バックグラウンドワーカーイベント(async/awaitではなく)で 'Search'メソッドを分割し、同期' GetData'リクエストを使用することでスレッド例外を取得できますか? –

+2

@ JeremyThompson:あなたのコードは何かをしなければならないので、フレームワークは*ここで行うべきではありません。 :/ –

関連する問題