2014-09-10 4 views
3

Я использую компонент круга загрузки, когда хочу прочитать некоторые данные из RSS. Я хочу отобразить этот компонент круга для ожидания пользователя.Как отобразить компонент обработки в форме окна

вот мой код:

private void btnUpdateRSS_Click(object sender, EventArgs e) 
     { 
      if (txtRSSGroup_Address.Text.Trim() == string.Empty) 
       return; 

      DialogResult dr = MsgBox.Show("اطلاعات قبلی از این RSS حذف شده و با اطلاعات جدید جایگزین می شود. \n \n آیا مطمئن به انجام عملیات به روز رسانی هستید؟", "هشدار", Mode.YesNo); 

      if (dr == System.Windows.Forms.DialogResult.Yes) 
      { 
       try 
       { 
        string[] RSSNews; 

        loadingCircleFF.Visible = true; 
        string address = txtRSSGroup_Address.Text.Trim(); 
        System.Threading.ThreadPool.QueueUserWorkItem((o) => 
        { 
         RSSNews = Utility.RSSNews_Read(address); 

         for (int i = 0; i < RSSNews.Length; i++) 
         { 
          if (RSSNews[i] != null && RSSNews[i] != string.Empty) 
          { 
           RSS.RSSGroup_ID = RSSGroupID; 
           RSS.RSS_Content = RSSNews[i]; 
           RSS.RSS_PersianDate = FreeControls.PersianDate.Now.ToString("YYYY/MM/dd"); 
           RSS.User_FirstName = GlobalVariable.User_FirstName; 
           RSS.User_LastName = GlobalVariable.User_LastName; 

           RSS.Insert(); 
          } 
          else 
           break; 
         } 

         this.BeginInvoke(new Action(() => { loadingCircleFF.Visible = false; })); 
        }); 

        RSS.DeleteByGroup(RSSGroupID); 

        MsgBox.Show("عملیات به روز رسانی با موفقیت انجام شد.", "موفقیت", Mode.Information); 
        DTcancel_RSS(null, null); 
       } 
       catch 
       { 
        MsgBox.Show("خطا در دریافت اطلاعات از RSS", "خطا", Mode.Information); 
       } 
      } 

     } 

, но проблема заключается в следующем:

перед тем, чтобы отобразить загрузки круг, это начать читать RSS и мое приложение будет замок! поэтому кружок загрузки никогда не отображается.

как исправить эту проблему?

+1

Вы должны начать новую тему для чтения RSSNews. И сделать отображение ложным, только ваше чтение RSSnews завершено. –

+0

Использование концепции Threading – Sathish

+0

@kishoreVM Как узнать, что прочитано RSSnews? – Elahe

ответ

1

Проблема ваш интерфейс не получит возможность перекрасить себя после того, как вы установили loadingCircleFF.Visible = true;, после постановки в очередь рабочий элемент в рабочий поток, ваш UI поток занят обработки RSS.DeleteByGroup(RSSGroupID); и DTcancel_RSS(null, null);, поэтому он не будет отображаться немедленно.

В моем обновленном коде я разместил их внутри тела QueueUserWorkItem, поэтому они не будут блокировать ваш поток пользовательского интерфейса.

Отмечено, что рабочий элемент запущен на рабочем потоке, чтобы ваше приложение не зависало. И когда вы скрываете загрузку CircleFF после того, как RSSNews успешно прочитано, вы должны использовать BeginInvoke для марширования вызова в потоке пользовательского интерфейса, поскольку вы не можете получить доступ к загрузке CircleFF из рабочего потока;

try 
{ 
    string[] RSSNews; 

    loadingCircleFF.Visible = true; 
    string address = txtRSSGroup_Address.Text.Trim(); 
    System.Threading.ThreadPool.QueueUserWorkItem((o) => 
    { 
     RSSNews = Utility.RSSNews_Read(address); 

     for (int i = 0; i < RSSNews.Length; i++) 
     { 
      if (RSSNews[i] != null && RSSNews[i] != string.Empty) 
      { 
       RSS.RSSGroup_ID = RSSGroupID; 
       RSS.RSS_Content = RSSNews[i]; 
       RSS.RSS_PersianDate = FreeControls.PersianDate.Now.ToString("YYYY/MM/dd"); 
       RSS.User_FirstName = GlobalVariable.User_FirstName; 
       RSS.User_LastName = GlobalVariable.User_LastName; 

       RSS.Insert(); 
      } 
      else 
       break; 
     } 

     this.BeginInvoke(new Action(() => { 
      loadingCircleFF.Visible = false; 
      //MessageBox.Show("عملیات به روز رسانی با موفقیت انجام شد.", "موفقیت");        
      RSS.DeleteByGroup(RSSGroupID); 

      //MessageBox.Show("عملیات به روز رسانی با موفقیت انجام شد.", "موفقیت"); 
      DTcancel_RSS(null, null); 
     })); 
     //If these methods don't access UI, call them normally, else wrap them with BeginInvoke. 
     //RSS.DeleteByGroup(RSSGroupID); 
     //DTcancel_RSS(null, null); 
    }); 
} 
catch 
{ 
    MessageBox.Show("خطا در دریافت اطلاعات از RSS", "خطا"); 
} 
+0

Это не сработало. на самом деле после прочтения RSS, появится загрузка круга – Elahe

+0

Можете ли вы показать мне весь код в вашем методе, предположим, что это обработчик события Click кнопки? Загрузка круга не будет отображаться до тех пор, пока весь код в обработчике событий не будет завершен. Или вы можете вызвать Application.DoEvents(), чтобы заставить перерисовать. – kennyzx

+0

Я добавляю весь мой код – Elahe

Смежные вопросы