如何在windows窗体中显示处理组件

本文关键字:显示 处理 组件 窗体 windows | 更新日期: 2023-09-27 18:21:14

当我想从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读取,我的应用程序将被锁定!因此加载圆永远不会显示。

如何解决这个问题?

如何在windows窗体中显示处理组件

问题是,在设置loadingCircleFF.Visible = true;之后,UI将没有机会重新绘制自己,在将工作项排队到工作线程之后,UI线程正忙于处理RSS.DeleteByGroup(RSSGroupID);DTcancel_RSS(null, null);,因此它不会立即显示。

在我更新的代码中,我将它们放在QueueUserWorkItem的主体中,这样它们就不会阻塞您的UI线程。

请注意,工作项是在工作线程上运行的,因此您的应用程序不会被冻结。当你在RSSNews被成功读取后隐藏loadingCircleFF时,你必须使用BeginInvoke将调用封送到UI线程,因为你不能从工作线程访问loadingCircle FF;

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", "خطا");
}