C# 如何在windows窗体中显示处理组件
当我想从RSS读取一些数据时,我使用了一个加载循环组件。我想向用户显示此圆组件以等待 这是我的密码:C# 如何在windows窗体中显示处理组件,c#,winforms,C#,Winforms,当我想从RSS读取一些数据时,我使用了一个加载循环组件。我想向用户显示此圆组件以等待 这是我的密码: private void btnUpdateRSS_Click(object sender, EventArgs e) { if (txtRSSGroup_Address.Text.Trim() == string.Empty) return; DialogResult dr = MsgBox.Sh
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);
}
}
}
private void btnupdaters\u单击(对象发送方,事件参数e)
{
if(txtRSSGroup_Address.Text.Trim()==string.Empty)
返回;
对话对话结果dr=MSGBBOX.MSGBBOBOX。展示结果结果DrDr=MSGBBOBOX。对话对话结果DrDr=MSGBBOBOBOX.MSGBBOBOBOBOX。结果对话对话对话结果DrDr=MSGBBOBOBOX。结果结果结果结果DrDr=MSGBBOBOBOBOX。显示(“(“15157555555555555555555555555555存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存存;
如果(dr==System.Windows.Forms.DialogResult.Yes)
{
尝试
{
字符串[]RSSNews;
loadingCircleFF.Visible=true;
string address=txtRSSGroup_address.Text.Trim();
System.Threading.ThreadPool.QueueUserWorkItem((o)=>
{
RSSNews=Utility.RSSNews_Read(地址);
for(int i=0;i{loadingCircleFF.Visible=false;}));
});
RSS.DeleteByGroup(RSSGroupID);
MsgBox.Show(“عملت㶪㶪㶪㶪㶪㶪㶪مو㶪㶪㶪㶪㶪㶪”㶪㶪㶪硂Ĵ硂硂硂硂硂硂硂硂硂30786;
DTU取消RSS(空,空);
}
抓住
{
MsgBox.Show(“RSS”、“模式信息”);
}
}
}
但问题是:
在显示加载循环之前,它开始从RSS读取,我的应用程序将被锁定!因此,加载循环永远不会显示
如何解决此问题?问题是,在设置
loadingCircleFF.Visible=true之后,您的UI将没有机会重新绘制自身
,将工作项排队到工作线程后,UI线程正忙于处理RSS.DeleteByGroup(RSSGroupID)
和DTcancel\u RSS(null,null)代码>,因此它不会立即显示
在我更新的代码中,我将它们放在QueueUserWorkItem的主体中,这样它们就不会阻塞您的UI线程
注意,工作项在工作线程上运行,因此您的应用程序不会冻结。当您在成功读取RSSNews后隐藏loadingCircleFF时,您必须使用BeginInvoke来封送对UI线程的调用,因为您无法从工作线程访问loadingCircleFF
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", "خطا");
}
试试看
{
字符串[]RSSNews;
loadingCircleFF.Visible=true;
string address=txtRSSGroup_address.Text.Trim();
System.Threading.ThreadPool.QueueUserWorkItem((o)=>
{
RSSNews=Utility.RSSNews_Read(地址);
for(int i=0;i{
loadingCircleFF.Visible=false;
//MessageBox.Show(“信息盒”节目);
RSS.DeleteByGroup(RSSGroupID);
//MessageBox.Show(“信息盒”节目);
DTU取消RSS(空,空);
}));
//如果这些方法无法访问UI,请正常调用它们,否则使用BeginInvoke包装它们。
//RSS.DeleteByGroup(RSSGroupID);
//DTU取消RSS(空,空);
});
}
抓住
{
MessageBox.Show(“RSS”、“RSS”);
}
您必须为RSSNews阅读启动一个新线程。只有RSSnews读取完成时,才将显示设为false。使用线程Concept@kishoreVM如何知道RSSnews阅读已完成?它不起作用。实际上,在阅读了RSS之后,循环加载将显示您的方法中的所有代码,假设它是一个按钮的点击事件处理程序,您能给我看一下吗?在事件处理程序中的所有代码完成之前,循环加载不会显示。或者您可以调用Application.DoEvents()来强制重新绘制。执行每一行需要多长时间(以毫秒为单位)RSSNews=Utility.RSSNews\u Read(address)
,RSS.DeleteByGroup(RSSGroupID)
和DTcancel\u RSS(null,null)代码>?Utility.RSSNews_Read(address)约为7000毫秒,RSS.DeleteByGroup(RSSGroupID)约为1000毫秒,DTcancel_RSS(null,null)约为1000毫秒。感谢它的工作。你能简单地解释一下你的代码吗?