gpt4 book ai didi

c# - 不正确的异步/等待工作,Excel 应用程序级加载项中的 Excel 事件

转载 作者:太空狗 更新时间:2023-10-29 17:39:03 26 4
gpt4 key购买 nike

我在加载项应用程序中使用 async/await 时遇到问题,我有自定义任务 Pane ,用户可以使用它下载一些数据,所以存在问题:

  1. 等待的操作完成后,控制不会返回到先前的执行上下文。我使用 Windows 窗体创建示例并粘贴相同的等待方法,它工作正常 - 我可以在等待操作后使用窗体控件,但不能在加载项中使用,我必须调用自定义任务 Pane Invoke 方法.简单示例:

    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. 在我的加载项中,我需要处理一些事件 - 工作表更改、工作表激活/停用,但这些事件消失并且在等待操作后不会被触发,我必须使用类似“切换”(删除+ 添加)每次等待使用后的事件。简单示例:

    private void ToggleWorkbookEvents()
    {
    var excel = Globals.MyAddIn.Application;
    //need to ensure event will not be set twice
    excel.SheetActivate -= CheckSheetForData;
    excel.SheetActivate += CheckSheetForData;
    if (excel.ActiveWorkbook != null)
    {
    var activeSheet = Globals.MyAddIn.GetActiveWorksheet();
    //need to ensure event will not be set twice
    activeSheet.Change -= Worksheet_Changed;
    activeSheet.Change += Worksheet_Changed;
    }
    }

所以 vsto 框架可能不支持最新版本的 .NET Framework 的新功能(如异步等待)?

最佳答案

这是 Office 插件的一个长期存在的问题:它们不提供 SynchronizationContext

正如我在我的博客中提到的,您可以通过 ensuring you have a proper SynchronizationContext 解决这个问题.这有点 hacky,但它有效:

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

至于“切换事件”问题,我不知道。

关于c# - 不正确的异步/等待工作,Excel 应用程序级加载项中的 Excel 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32865245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com