如何在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读取,我的应用程序将被锁定!因此加载圆永远不会显示。
如何解决这个问题?
问题是,在设置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", "خطا");
}