【问题标题】:Does VBA support Task.Wait() from a C# class import?VBA 是否支持来自 C# 类导入的 Task.Wait()?
【发布时间】:2017-07-02 18:51:41
【问题描述】:

我编写了一个连接到 Dropbox 的 C# 类,可以让你上传、下载、删除和生成链接文件。

它与 Windows 窗体一起工作,但我必须从 VBA (Microsoft Access) 访问它。问题出现在 task.Wait() 中。我已经“调试”了这个抛出的异常,之后就没有通过了。

public DropBox()
{
    //Empty constructor because VBA doesn't support constructors with args
}

public void Connect(string tokenUser)
{
    try
    {
        dropbox = new DropboxClient(tokenUser);
        var taskInicio = Task.Run(async () => await dropbox.Users.GetCurrentAccountAsync());
        //throw new Exception("Arriving?");   //ARRIVES
        taskInicio.Wait();
        throw new Exception("Arriving?");    //Throws "one or more errors"
    }
    catch (AggregateException ex)
    when (ex.InnerException is BadInputException
          || ex.InnerException is AuthException)
    {
        throw new Exception("Incorrect Token or without access", ex.InnerException);
    }
}

在 VBA 上

Option Compare Database

Private Sub btActivar_Click()
    Call test
End Sub

Public Function test()

    Dim objDrop As CloudFiles.DropBox
    Set objDrop = New CloudFiles.DropBox

    MsgBox (objDrop.HolaMundo)
    objDrop.Connect("TokenLongChicken")
    'objDrop.DeleteFile("https://www.dropbox.com/s...?dl=0")


End Function

“产生的一个或多个错误”听起来像是来自“mscorlib”左右......

有什么想法吗?这变得非常混乱:/

谢谢。

【问题讨论】:

  • 我有待纠正,但如果我没记错的话,VBA 核心功能的最后一次更新发生在 2003 年。这些功能极不可能被添加到语言中。
  • @Steve - 这是 MS 在 2003 年构建的 - msdn.microsoft.com/en-us/library/aa213656(office.11).aspx
  • 你能改变连接方法返回一个布尔值,然后在 VBA 中执行 until = true,如果一旦任务完成从 C# 中返回 true?
  • “一个或多个错误产生”是一个 AggregateException。所以这并没有像你预期的那样出错,这是抛出的任务。并且 InnerException 与 when 子句不匹配,它永远不会匹配,因为它使用 InnerExceptions 属性。注意 s。考虑 Flatten() 并重新抛出 InnerExceptions[0]。

标签: c# ms-access vba dropbox-api


【解决方案1】:

VBA 确实有Application.Wait,我想你可以试一试。我有一个等待 IE 连接的代码,您可以将其用作示例:

Do While IE.Busy ' Need to wait until the page has loaded
  Application.Wait (Now + TimeValue("00:00:01")) ' Wait one second
Loop

如果对你有帮助,请告诉我。

【讨论】:

  • Pedro,您也可以在 IE 示例中检查 document.readystate,然后尝试 doevents 而不是等待。
  • 是的,我知道。但在我的情况下,我有一个循环将多个页面加载到 webscrap,有时浏览器会挂起,甚至在每个循环中都执行 IE.QuitSet IE = Nothing。这就是为什么我要检查IE.Busy
【解决方案2】:

我很头疼,以为它可能与任务、异步、等待...有关,而这与 Newtonsoft json 库有关。

我通过 NuGet 将库更新到 9.0 版本,并且在 Windows 窗体上一切正常,但是当我通过 .TLB 使用它时似乎出现了问题,因为当我逃避异常时,我在删除时遇到了一些问题方法,它说 Newtonsoft Json 7.0.0.0 库丢失(无论如何它在同一目录中)。

我终于删除了我正在使用的 Newtonsoft Json 版本和 Dropbox API,再次下载了盒子,但我拒绝应用任何更新。我什至无法尝试应用降级。

好结局,但我真的不明白为什么当我在我的 Windows 窗体项目上使用 9.x 时它会搜索 7.0.0.0,它可以工作并导出 .DLL 和 .TLB。

谢谢大家。

编辑:是的,我想这回答了这个问题:VBA 支持 Task.Wait(至少来自 C# .dll 导入)

【讨论】:

  • 嗯,这不是问题,事情发生了。你的异常处理被严重破坏了,你最好修复它,因为这会再次发生。如果您不这样做,那么您将再次不知道出了什么问题。
  • 感谢您的评论。我在我的项目上创建了事件自定义异常,但在这样做之前(在项目开始时)我看到“发生了一个或多个错误”。如何在 VBA 上调试外部库是(不)有趣的 :(
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 2013-05-11
  • 1970-01-01
  • 2016-03-28
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多