1

我正在使用反射来使用WindowsAPICodePack函数Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.SetProgressValue
它可以工作,但速度很慢。通常它需要大约 20-30 毫秒,但使用这种方法,一个呼叫会增加到大约 180-190 毫秒。
听说反射调用方法比正常调用要慢1000倍左右,于是找了个方法来加快速度。

最初,我有这个:

//class constructor
asm = Assembly.LoadFrom("Microsoft.WindowsAPICodePack.Shell.dll");
type = asm.GetType("Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager");
classInstance = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type);

progressBarValueMethod = type.GetMethod("SetProgressValue", new Type[2]{typeof(int), typeof(int)});

//class method
progressBarValueMethod.Invoke(classInstance, new object[2]{val * 10, max * 10});

我试图通过改变它来加速它:

//class contructor
progressBarValueMethod = type.GetMethod("SetProgressValue", new Type[2]{typeof(int), typeof(int)});

//class method
progressBarValueMethod.Invoke(classInstance, new object[2] { val * 10, max * 10 });

对此:

//class constructor
progressBarValueMethod = type.GetMethod("SetProgressValue", new Type[2]{typeof(int), typeof(int)});
progressBarStateMethodDelegate = Delegate.CreateDelegate(typeof(Func<int, int>), classInstance, progressBarValueMethod);

//class method
progressBarStateMethodDelegate.DynamicInvoke(new object[2] { val * 10, max * 10 });

但它没有用。调用这个方法仍然需要大约 180 毫秒。
我找到了另一个解决方案,所以我再次更改了代码:

//class constructor
progressBarValueMethod = type.GetMethod("SetProgressValue", new Type[2]{typeof(int), typeof(int)});
delegateFunc = (Func<int, int>)Delegate.CreateDelegate(typeof(Func<int, int>), classInstance, progressBarValueMethod);

//class method
delegateFunc(val * 10, max * 10);

这没有改变。稳定 180 毫秒。有没有不同的方法来加速它?
顺便说一句,我使用的是 .NET 2.0。

4

0 回答 0