我尝试在我的软件中实现线程,以防止UI在后台进行嵌套的foreach循环时冻结。我遇到的问题是,当这个工作时,它会使处理速度降低一个TON。过去需要10秒钟的时间需要1分钟。我如何进行线程化是这样的:
用户按下按钮(这是按钮的代码)
CheckForIllegalCrossThreadCalls = false;
new Thread(() => beginSearchAll()) { IsBackground = true }.Start();
该按钮调用beginSearchAll方法
public void beginSearchAll()
{
if (FileVersionInfo.GetVersionInfo(fsd.getSkypePath()).ProductVersion != "6.16")
{
logcount = 0;
counter = 0;
listViewEx1.Items.Clear();
println("\nSearching all contacts...");
ListView.CheckForIllegalCrossThreadCalls = false;
fsd.searchAllNormal(s, this);
}
else
{
logcount = 0;
counter = 0;
listViewEx1.Items.Clear();
println("\nSearching all contacts...");
fsd.searchAllDeob(s, this);
}
println("\nComplete!")
}
搜索所有方法将检查用户所使用的Skype版本,然后运行searchAllNormal方法(完成所有工作的方法),该方法位于名为“fsd”的单独类中。我不会包括整个方法,而是它的要点。
public static void searchAllNormal(Skype s, Form1 f1)
{
foreach (User user in s.Friends)
{
foreach (string log in Directory.GetFiles(f1.path, "debug*.log"))
{
string[] fileToRead = File.ReadAllLines(log);
foreach (string line in fileToRead)
{
//parse data
f1.addToList(user,c,data);
}
}
}
}
找到用户的数据后,它会调用一个方法将数据添加到位于Form1中的listView
public void addToList(User user, string c, string b)
{
listViewEx1.Items.Add(new ListViewItem(b)
{
SubItems = { user.Handle, user.FullName, c }
});
}
然后,对于我的Skype联系人上的每个用户,它显然会重复。当我改变
new Thread(() => beginSearchAll()) { IsBackground = true }.Start();
到
beginSearchAll();
它冻结了用户界面,但速度更快。是否可以保持速度,但UI也不会冻结?