异步任务调用程序集

问题描述 投票:0回答:1

我正在名为 Autodesk Revit 的设计程序中运行自定义插件,并且最近实现了异步使用情况报告,但此更改导致我的调用程序集发生更改。

在此更改之前,我正在同步记录使用情况,但这导致 UI 冻结了一秒钟。对异步的更改效果很好,但调用程序集似乎已更改。我这么说的原因是因为我将程序集版本记录为使用报告的一部分,因此我知道用户安装了哪个版本的插件,但现在调用程序集更改为 mscorlib 并且它显示了此 Microsoft 程序集的版本。

我尝试过调用程序集、执行程序集和入口程序集,但没有指向调用该方法的插件。有什么想法吗?

Version assemblyVersion = Assembly.GetCallingAssembly().GetName().Version;
c# .net-assembly
1个回答
0
投票

这可能是因为异步的工作原理。

异步方法将被分成不同的部分,可能在不同的时间执行,因此是“异步的”。但这意味着除了第一部分之外,您将失去所有调用堆栈。这样做的结果是需要使用任务来返回东西。 “async”、Task 和“await”实际上允许您假装该方法正常运行,同时在幕后做一些完全不同的事情。

如果您直接检查调用堆栈,这种错觉就会被打破。您只会看到从线程池中调用您的方法,而不知道最初是什么导致了调用。这很可能是调用程序集不同的原因。

有几种可能的解决方案:

  1. 在执行任何异步操作之前收集所有必需的数据。 (如果收集数据需要时间,这将无济于事)
  2. 切换到 Caller* 属性来收集数据,例如 [CallerFilePath]。这不会做完全相同的事情,但可以实现相同的目的,并且基本上是免费的。
© www.soinside.com 2019 - 2024. All rights reserved.