当前位置: 首页 > 编程语言 > C#

C#WinForms-如何在进程等待完成时显示加载控件,我使用“LoadingCircle”和一个线程来共享

时间:2023-04-10 20:54:01 C#

C#WinForms-如何在进程等待完成时显示加载控件。我将“LoadingCircle”与一个线程一起使用我决定使用这个第三方组件在我的窗口窗体中进行简单的加载控制。http://www.codeproject.com/Articles/14841/How-to-write-a-loading-circle-animation-in-NET这适用于打开和关闭,在单个请求中更改属性“活动”True或错误(一次一个)。问题是,当进程正在等待服务时,我假装在进程启动之前激活loadingControl,并在我“认为”进程必须完成时关闭。当我这样做时,图像加载显示为静态图像。(没有动画)。很抱歉这个问题,我是C#的新手。但我想我需要使用Threads或类似的东西。所以我的一般代码是这样的:使用[此处的库]...;namespace[这里的命名空间]{公共部分类Form1:Form{publicForm1(){InitializeComponent();this.loadingCircle1.Visible=false;}privatevoidbutton1_Click(objectsender,EventArgse){Threadt=newThread(newThreadStart(showLoading));this.loadingCircle1.Visible=true;t.开始();//导入Excelt.Abort();}publicvoidshowLoading(){loadingCircle1.Active=true;loadingCircle1.RotationSpeed=10;但是,加载显示为没有动画的静态图像。您创建一个线程,它只设置两个属性,然后结束。t.Abort可能什么都不做,因为此时线程已经退出。更糟糕的是,您在UI线程上导入excel文件,这会阻止任何动画并冻结整个UI。你应该这样做:备注:当然,如果你的表单是响应式的,你必须禁用/启用控件,并为加载期间关闭表单时发生的情况做好准备。1.使用线程如果你真的想明确地使用线程,这样做:publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}私有线程workerThread=null;privatevoidbtnImport_Click(objectsender,EventArgse){//开始动画(我用了一个进度条,在这里开始你的圈子)progressBar1.Visible=true;progressBar1.Style=ProgressBarStyle.Marquee;//启动作业和定时器,轮询线程btnImport.Enabled=false;workerThread=新线程(LoadExcel);workerThread.Start();timer1.Interval=100;timer1.开始();}privatevoidLoadExcel(){//一些工作需要5秒Thread.Sleep(5000);}privatevoidtimer1_Tick(objectsender,EventArgse){if(workerThread==null){timer1.Stop();返回;}//仍然有效:退出if(workerThread.IsAlive)return;//完成btnImport.Enabled=true;timer1.Stop();progressBar1.Visible=false;workerThread=null;}}2.后台工作者BackgroundWorker可以在完成时抛出一个事件:publicpartialclassForm1:Form{公共Form1(){InitializeComponent();backgroundWorker1.DoWork+=BackgroundWorker1_DoWork;backgroundWorker1.RunWorkerCompleted+=BackgroundWorker1_RunWorkerCompleted;}privatevoidbtnImport_Click(objectsender,EventArgse){//开始动画progressBar1.Visible=true;progressBar1.Style=ProgressBarStyle.Marquee;//启动作业btnImport.Enabled=false;backgroundWorker1.RunWorkerAsync();}privatevoidBackgroundWorker1_DoWork(objectsender,DoWorkEventArgse){LoadExcel();}privatevoidBackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){btnImport.Enabled=true;progressBar1.Visible=false;}privatevoidLoadExcel(){//一些工作需要5秒Thread.Sleep(5000);}}3.使用async-await这是最简单的一个publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privateasyncvoidbtnImport_Click(objectsender,EventArgse){//开始等待动画progressBar1.Visible=true;progressBar1.Style=ProgressBarStyle.Marquee;//只需启动并等待加载任务btnImport.Enabled=false;awaitTask.Run(()=>LoadExcel());//重新启用事物btnImport.Enabled=true;progressBar1.Visible=false;}privatevoidLoadExcel(){//一些工作需要5秒Thread.Sleep(5000);我推荐使用async/await(forC#5.0):以上是C#学习教程:C#WinForms-Howtodisplayloadingwhiletheprocessiswaitingtocompletecontrols.我使用“LoadingCircle”并在一个线程中共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——privatevoidbutton1_Click(objectsender,EventArgse){ImportAsync();}privateasyncTaskImportAsync(){//UI线程showLoading();this.loadingCircle1.Visible=true;//等到任务完成awaitTask.Run(()=>{//不同的非阻塞线程完成所有艰苦的工作,但没有UI-stuff//导入Excel});//回到UI线程this.loadingCircle1.Visible=false;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: