有没有办法只缓存程序集而不运行

功能建议 · 762 次浏览
FaniX 创建于 2025-06-03 11:01

C#代码的编译需要消耗一定时间,所以每次初次运行的时候都会在运行C#脚本那一步卡一会,在一些强交互的流程下会影响使用体验。

我想在动作开始的时候检测一段C#代码是否已有缓存,如果没有的话就编译和缓存C#代码、提示正在编译的消息,但不运行(不执行Exec函数)。当正式用运行的时候直接使用缓存的内容,避免编译耗时对交互流程的影响。

不知道能不能实现?


回复内容
CL 2025-06-03 13:59
#1

选择一下缓存程序集,然后重启一下quicker,右键调试运行,看看c#步骤需要多长时间? 这时候应该只是加载已有程序集,理论上应该比较快的。

FaniX 回复 CL 2025-06-03 19:34 :

如果是普通模式运行C#脚本,不管是否勾选“允许缓存程序集”,第二次运行同一脚本的时候都是比较快的,只是初次运行时比较慢(应该是因为需要编译)。由于编译过程没有提示,所以初次运行动作的时候到了C#脚本这一步就会卡一下,不太流畅。因此我希望能够在动作的开头编译和缓存动作内需要用到的C#代码(不执行Exec函数)并显示消息提示用户需要等待一会。不过目前好像没有只缓存代码但不执行Exec函数的办法,也无法判断代码是否已经编译过(如果编译过就不需要提示消息)。

运行C#脚本的步骤有一个生成程序集的选项,但是那个需要设置命名空间,而且给的示例里好像没有Exec函数,直接贴运行脚本的代码也是无法通过编译的。

CL 回复 FaniX 2025-06-03 22:43 :

目前没这个选项。 我感觉可能最新的windows里修改了什么机制,CodeDOM编译速度不如Roslyn了,后面再研究下试试了。

Anlv 23天15小时前
#2

挖个坟

public static void Exec(IStepContext context)
{
    if ((context.GetVarValue("quicker_in_param") as string) == "qk_compile_mode")
        return;
    ...省略

这个示例是通过传递参数  `qk_compile_mode`  激活 C# 模块,此时会编译,但返回 return 而不执行具体功能。

FaniX 回复 Anlv 23天10小时前 :

感谢建议,可以结合并行步骤组实现等待编译的提示,基本上实现了我的需求。

FaniX 23天10小时前
#3

感谢@Anlv 提供的建议,以下是一种提示等待编译的方法:

  1. 在C#代码主程序开头添加if(!(bool)context.GetVarValue("isSuccess")) return;,并将运行是否成功结果写入isSuccess变量
  2. 使用一个多线程步骤组包裹该步骤,并加入一个与编译并行的步骤组,内容为等待超时后判断编译是否完成,未完成则提示正在编译的消息
  3. 一般来说,一旦编译完成,return退出的速度会很快,等待超时可以很短(实际取决于设备)。

Anlv 回复 FaniX 23天9小时前 :
Nice
Anlv 最后更新于 23天9小时前
Anlv 20天10小时前
#4

我在想,动作作者可以通过传递特定参数,只缓存而不执行,那么这个功能是否可以加到动作模块中,或者Quicker设置中?
譬如,“自动缓存程序集” 在运行 Quicker 时自动缓存。


FaniX 回复 Anlv 20天9小时前 :

这样需要在动作开始运行前先扫描所有勾选了自动缓存的步骤才能实现吧?如果有子程序可能就更复杂了。
我觉得比较容易实现的是添加一个“编译而不运行”选项,这样可以省下一个if(!(bool)context.GetVarValue("isSuccess")) return;语句和一个isSuccess变量

另外如果要让CL看见可能需要单独开一个讨论帖,或者回复他的回帖,否则好像只有讨论帖创建者和被回复的人会收到消息(?)。

Anlv 回复 Anlv 20天9小时前 :

另开新帖吧,哈哈哈

回复主贴