我们与145000行和4列的RadGridView一起工作。我们使用复制粘贴来移动数据从其他应用程序和应用程序与Telerik构建。
当我们复制一个平面文件(用制表符分隔字段)并将其粘贴到RadGridView时,整个过程非常缓慢。从剪贴板中检索数据的函数需要几分钟(可能需要几个小时,我取消了它)。它将原因追踪到StringTokenizer类。标记器将字符串分割成单独的字段。但是在提取一个字段之后,它会创建该字符串(包含大约10MB的数据)减去该字段的新副本。我修补了它(与HarmonyX),现在只需要一秒钟:
静态类StringTokenizerPerformancePatch{静态私人只读的InstanceFieldAccessor<StringTokenizer,LinkedList<字符串> > _tokens=新InstanceFieldAccessor< StringTokenizer, LinkedList<字符串> > (“令牌”);静态私人只读的InstanceFieldAccessor<StringTokenizer,字符串> _sourceString=新InstanceFieldAccessor < StringTokenizer,字符串> (“sourceString”);静态私人只读的InstanceFieldAccessor<StringTokenizer,字符串> _delimiter=新InstanceFieldAccessor < StringTokenizer,字符串> (“分隔符”);静态私人只读的InstanceFieldAccessor<StringTokenizer,IEnumerator<字符串> > _enumerator=新InstanceFieldAccessor < StringTokenizer, IEnumerator <字符串> > (“计数器”);[HarmonyPatch (typeof (StringTokenizer),“标记”)]静态类Patch_StringTokenizer_Tokenize{静态保龄球前缀(StringTokenizer __instance){vartoken = _token . getvalue (__instance);varsourceString = _sourceString.GetValue(__instance);vardelimiter = _delimiter.GetValue(__instance);Tokenize(tokens, sourceString, delimiter);_enumerator。SetValue (__instance tokens.GetEnumerator ());返回假;}静态私人无效标记(LinkedList <字符串>标记,字符串文本,字符串分隔符){tokens.Clear ();如果(字符串.IsNullOrEmpty(文本)返回;int指数=0;而(真正的) {varIndex2 =文本。IndexOf(delimiter, index, stringcompare . ordinal);如果(index2 <0) {tokens.AddLast(text.Substring(index));打破;}字符串Token =文本。子字符串(index, index2 - index);tokens.AddLast(令牌);index = index2 + delimiter.Length;} } } }
请更新您的tokanizer以提高性能。当你在做的时候: