この投稿を読んで、同じことをしようとしましたが、del.DynamicINvoke(args) と比較すると、非常に奇妙な動作に遭遇しました。del(引数)
アップデート
したがって、Jon と usr のコメントの後、新しい作業コードを投稿します。
どんな助けにも本当に感謝します!
コード:
using System;
using System.Diagnostic;
using System.Threading;
namespace DynamicInvokeVsInvoke {
public class Program {
static void Main(string[] args) {
var objArgs = new object[] {100, 1.2345678 };
Action<int, double> a = (i, d) => {};
Action<object[]> action = o => a((int)o[0], (double)o[1]);
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
a.DynamicInvoke(objArgs);
Console.WriteLine("Dynamic: " + sw.ElapsedMilliseconds);
sw.Stop();
sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
action(objArgs);
Console.WriteLine("Invoke: " + sw.ElapsedMilliseconds);
sw.Stop();
}
}
}
結果:
「a」が空のメソッドで、ループが 1000000 回実行される場合、DynamicInvoke は約 4000 ミリ秒かかり、直接 Invoke は 20 ミリ秒かかりました。
Thread.Sleep(20) に入れてループを 1000 回実行すると、DynamicInvoke と直接 Invoke に約 20 秒かかりました
ps 何らかの理由で vs からコピー/貼り付けできないので、構文エラーが表示された場合は手動でコードを記述します。お知らせください