多线程防止UI冻结,但比单线程更慢?

时间:2016-07-19 03:20:26

标签: c#

我尝试在我的软件中实现线程,以防止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也不会冻结?

0 个答案:

没有答案