2015-09-30 18 views
6

Tôi gặp phải sự cố khi sử dụng async/await trong ứng dụng bổ trợ của mình, tôi có ngăn tác vụ tùy chỉnh và người dùng có thể tải xuống một số dữ liệu. là vấn đề:Không chính xác không đồng bộ/đang chờ hoạt động, các sự kiện Excel trong Excel Application Level Bổ trợ

  1. Sau khi hoạt động được chờ hoàn thành, kiểm soát không được trả về ngữ cảnh thực thi trước đó. Tôi đã tạo ví dụ với các biểu mẫu cửa sổ và dán cùng một phương thức đang chờ và nó hoạt động tốt - Tôi có thể sử dụng các điều khiển biểu mẫu sau khi chờ hoạt động, nhưng không phải trong bổ trợ, tôi phải gọi ngăn tác vụ tùy chỉnh Gọi phương thức. ví dụ đơn giản:

    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. Trong tôi add-in tôi cần phải xử lý một số sự kiện - bảng thay đổi, bảng kích hoạt/vô hiệu hóa, nhưng những sự kiện biến mất và không bị sa thải sau khi chờ đợi hoạt động và tôi phải sử dụng một cái gì đó như "toggling" (xóa + thêm) sự kiện sau mỗi lần chờ sử dụng. ví dụ đơn giản:

    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; 
        } 
    } 
    

Vì vậy, có lẽ khuôn khổ VSTO không thể hỗ trợ các tính năng mới (như async chờ) của các phiên bản mới nhất .NET Framework?

+1

Câu hỏi về Stackoverflow phải có mã được liên kết với chúng. Vui lòng chỉnh sửa với nhiều chi tiết hơn để chúng tôi có thể cố gắng giúp đỡ các vấn đề thực tế của bạn. – SpaceSteak

+0

@SpaceSteak Tôi đã thêm một số ví dụ mã, nhờ –

+0

Tại sao bạn không chờ đợi trên 'Tìm kiếm'? –

Trả lời

11

Đây là sự cố lâu dài với các plugin Office: chúng không cung cấp SynchronizationContext.

Như tôi đã đề cập trên blog của mình, bạn có thể giải quyết vấn đề này theo số ensuring you have a proper SynchronizationContext. Đây là một chút hacky, nhưng nó hoạt động:

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(); 
} 

Theo như vấn đề "toggling events", tôi không biết.

+0

Tại sao bạn xem xét nó một chút hacky? –

+0

cảm ơn, vì tôi hiểu nhân viên nền tảng có giải quyết được vấn đề của tôi không? Tôi có thể chia 'phương thức' Search' trên các sự kiện nhân viên nền (thay vì async/await) và sử dụng yêu cầu đồng bộ 'GetData', vì vậy tôi sẽ nhận được ngoại lệ thread? –

+2

@JeremyThompson: Bởi vì mã của bạn phải làm một cái gì đó khuôn khổ * nên * được làm không chỉ ở đây nhưng ở khắp mọi nơi nó gọi mã của bạn. :/ –

Các vấn đề liên quan