2016-08-13 7 views
1

私のUIは、Thread.Sleep()メソッドを使用するまで、backgroundworkerを使用してブロックしています。しかし、50,000以上のステップで私のプログラムは非常に遅くなります。ここBackgroundworkerブロックされたUI

はdo_work方法である:

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()でした。

+0

これはあまりにも多くのコードです。バックグラウンドでUIにアクセスしていますか? – user3185569

+0

'worker.ReportProgress(1、new_emoticons.Count());'を削除して、もう一度やり直してください。まだ凍っている? –

答えて

1

あなたのUIが凍結している最も一般的な理由は、メインのUIスレッドに到達し、そこでかなりの量の作業を実行しているということです。

非常に急速に呼び出される場合、またはProgress_Changedイベントが多くの作業を行っている場合、この行が最も発生しやすい原因です。そのメソッドのすべてがメインスレッドで実行されます。上記のラインアウト

worker.ReportProgress(1, new_emoticons.Count());        

コメントあなたがそれを必要とする、または作成しない場合は必ず、あまり頻繁に呼ばれています:あなたは、あなたがそれを必要と知っている限り

if ((counter % 10) == 0) 
    worker.ReportProgress(1, new_emoticons.Count()); 

Thread.Sleepを避け、は間違いApplication.DoEvents()を避けます。

関連する問題