首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后台工作程序阻止UI

后台工作程序阻止UI
EN

Stack Overflow用户
提问于 2016-08-13 15:01:49
回答 1查看 72关注 0票数 1

在我使用Thread.Sleep()方法之前,我的UI仍然通过使用背景工作者来阻塞。但是如果我的程序超过50.000步,我的程序就会很慢。

下面是do_work方法:

代码语言:javascript
复制
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        List<object> arguments = e.Argument as List<object>;
        SortedDictionary<string, List<string>> installed_emoticons, twitch_emoticons, new_emoticons;
        int counter = 0;
        sw.Restart();
        installed_emoticons = arguments[1] as SortedDictionary<string, List<string>>;
        switch (Convert.ToInt32(arguments[0]))
        {
            //umwandeln dynamic twitch_emoticons in SortedDictionarray
            //prüfen welche Emoticons neu heruntergeladen werden müssen
            case 1:
                twitch_emoticons = new SortedDictionary<string, List<string>>();
                new_emoticons = new SortedDictionary<string, List<string>>();
                dynamic din_twitch_emoticons = (arguments[2] as dynamic)["emoticons"];
                foreach (dynamic new_emoticon in din_twitch_emoticons)
                {
                    //Prüfen ob der worker abgebrochen werden soll
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                    //Zerlegen der informationen aus der dynamischen Variable
                    string code = new_emoticon["code"].ToString();
                    string id = new_emoticon["id"].ToString();
                    string emoticon_set = new_emoticon["emoticon_set"].ToString();

                    //Prüfen ob das Emoticonset einen Wert enthält
                    if (emoticon_set == null) emoticon_set = "0";
                    //Prüfen ob ein Standard Emoticon enthalten ist
                    if (standard_emotes.ContainsKey(code)) code = standard_emotes[code];
                    //Speichern der Emoticons aus der dynmaischen Twitch Variablen in ein SortedDicitionary
                    if (!twitch_emoticons.ContainsKey(code))
                        twitch_emoticons.Add(code, new List<string> { @"\images\emoticons\" + emoticon_set + "\\" + id + ".png" });
                    else
                        twitch_emoticons[code].Add(@"\images\emoticons\" + emoticon_set + "\\" + id + ".png");

                    //Prüfen ob ein neues Emoticon enthalten ist
                    if (!installed_emoticons.ContainsKey(code))
                    {
                        if (!new_emoticons.ContainsKey(code))
                            new_emoticons.Add(code, new List<string> { @"\images\emoticons\" + emoticon_set + "\\" + id + ".png" });
                        else if (!new_emoticons[code].Contains(@"\images\emoticons\" + emoticon_set + "\\" + id + ".png"))
                            new_emoticons[code].Add(@"\images\emoticons\" + emoticon_set + "\\" + id + ".png");                            
                    }
                    else if (!installed_emoticons[code].Contains(@"\images\emoticons\" + emoticon_set + "\\" + id + ".png"))
                    {
                        if (!new_emoticons.ContainsKey(code))
                            new_emoticons.Add(code, new List<string> { @"\images\emoticons\" + emoticon_set + "\\" + id + ".png" });
                        else
                            new_emoticons[code].Add(@"\images\emoticons\" + emoticon_set + "\\" + id + ".png");
                    }
                    counter++;
                    if ((counter % 4) == 0)
                        System.Threading.Thread.Sleep(1);
                    worker.ReportProgress(1, new_emoticons.Count());                            
                }
                //e.Result = null;
                e.Result = new List<object> {2, installed_emoticons, twitch_emoticons, new_emoticons };
                break;
            //
            case 2:

                break;
        }
    }

我用Application.DoEvents()尝试它。但唯一的方法是Thred.Sleep();

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-13 15:13:42

您的UI冻结的最可能的原因是,您正在做一些接触到主UI线程并在其上执行大量工作的事情。

这一行最有可能是罪魁祸首,如果它被快速调用,或者如果Progress_Changed事件正在做大量工作.该方法中的所有内容都在主线程上执行。

代码语言:javascript
复制
worker.ReportProgress(1, new_emoticons.Count());                            

如果您不需要上面的行,或者确保不经常调用它,请将其注释掉:

代码语言:javascript
复制
if ((counter % 10) == 0)
    worker.ReportProgress(1, new_emoticons.Count());

除非您知道需要Thread.Sleep,否则不要使用Application.DoEvents(),并且绝对不要使用Application.DoEvents()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38933999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档