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

在BackgroundWorker运行时显示模态窗口,而不会出现STA - MTA问题分享

时间:2023-04-10 16:48:08 C#

C#LearningTutorial:ShowingModalWindowWhileBackgroundWorkerisRunningWithoutSTA/MTAIssues我有一个耗时的方法,我想通过BackgroundWorker异步运行。在该方法运行时,我想显示一个模式“请稍候...”对话框窗口,该窗口必须在BackgroundWorker完成时自动关闭。我目前对BackgroundWorker或任何多线程编程的经验很少。下面的代码当前导致InvalidOperationException并显示消息“调用线程必须是STA,因为许多UI组件都需要这个”。请告诉我如何实现我想要实现的目标,如果你能帮助我理解出了什么问题,请告诉我如何获得额外的布朗尼积分。太感谢了!编辑只是为了澄清-这个想法是主线程启动BackgroundWorker然后显示模态对话框。工作人员完成后,它会关闭模态对话框。当模态对话框关闭时,主线程继续。公共类ImageResizer{私有BackgroundWorker工作者;私有MemoryStreamImageData{得到;放;}//传入数据privatepublicMemoryStreamResizedImageData{get;私有集;}//结果数据privateDialogs.WorkInProgressDialogProgressDialog;//公共接口,使用类调用:publicMemoryStreamReduceImageSize(MemoryStreamimageData){//注入数据:this.ImageData=imageData;//初始化进度对话框窗口:ProgressDialog=newDialogs.WorkInProgressDialog();//启动异步工作的后台工作者worker=newBackgroundWorker();worker.DoWork+=newDoWorkEventHandler(worker_DoWork);worker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);worker.RunWorkerAsync();//显示进度对话框。对话框是模态的,只有在调整大小完成后才能关闭ProgressDialog.ShowDialog();//此行导致无效操作异常//此线程只会ProgressDialog关闭时继续。//返回结果returnResizedImageData;}privatevoidworker_DoWork(objectsender,DoWorkEventArgse){//调用耗时方法ResizedImageData=ReduceImageSize_ActualWork();ReduceImageSize_ActualWork(){//大量调整this.ImageData大小并将其分配给this.ResizedImageData的代码}privatevoidworker_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){//异步工作完成-关闭进度对话框ProgressDialog.Close();你不能从BackgroundWorker调用ShowDialog你必须使用Dispatcher来请求UI线程来执行它:this.Dispatcher.BeginInvoke(newAction(()=>ProgressDialog.ShowDialog()));BackgroundWorker的“Completed”事件是在UI线程中执行的,所以这部分应该没问题。以上就是C#学习教程:BackgroundWorker运行时显示模态窗口,没有STA/MTA问题。所有分享的内容,如果对大家有用,需要进一步了解C#学习教程,还望大家多加关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: