Questions tagged «backgroundworker»

BackgroundWorker是.NET的System.ComponentModel命名空间中的帮助程序类,它提供了基于事件的异步模式的常规实现,以管理工作线程,支持协作取消和报告进度。

13
调用线程无法访问该对象,因为其他线程拥有它
我的代码如下 public CountryStandards() { InitializeComponent(); try { FillPageControls(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Country Standards", MessageBoxButton.OK, MessageBoxImage.Error); } } /// <summary> /// Fills the page controls. /// </summary> private void FillPageControls() { popUpProgressBar.IsOpen = true; lblProgress.Content = "Loading. Please wait..."; progress.IsIndeterminate = true; worker = new BackgroundWorker(); worker.DoWork += …

4
如何使用WPF背景工
在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要7到8秒才能完成,在此期间我的UI变得无响应。为了解决这个问题,我在一个单独的线程中执行初始化: public void Initialization() { Thread initThread = new Thread(new ThreadStart(InitializationThread)); initThread.Start(); } public void InitializationThread() { outputMessage("Initializing..."); //DO INITIALIZATION outputMessage("Initialization Complete"); } 我已经阅读了几篇有关BackgroundWorker以及如何使我的应用程序保持响应的文章,而不必编写线程来执行冗长的任务,但是尝试实现它并没有获得成功,有人可以告诉我我会怎么做这个用BackgroundWorker?

11
BackgroundWorker vs背景线程
我对应该在Windows Form应用程序上使用的后台线程实现的选择有一个风格上的问题。目前,我BackgroundWorker在具有无限(while(true))循环的表单上。在此循环中,我用于WaitHandle.WaitAny保持线程休眠,直到发生感兴趣的事情为止。我等待的事件句柄之一是“ StopThread”事件,因此我可以跳出循环。从我重写时发出此事件信号Form.Dispose()。 我读过某个地方,该地方BackgroundWorker实际上是您不希望将UI与之捆绑在一起并具有有限结局的操作-例如下载文件或处理一系列项目。在这种情况下,“结束”是未知的,只有在关闭窗口时才知道。因此,对我而言,使用后台线程而不是BackgroundWorker为此目的更合适吗?

4
异步/等待与BackgroundWorker
在过去的几天中,我测试了.net 4.5和c#5的新功能。 我喜欢它的新异步/等待功能。之前,我曾使用BackgroundWorker通过响应UI在后台处理更长的进程。 我的问题是:有了这些不错的新功能之后,什么时候应该使用async / await以及什么时候使用BackgroundWorker?两者都有哪些常见方案?

8
向背景工作者发送参数?
假设我想将int参数发送给后台工作者,这如何完成? private void worker_DoWork(object sender, DoWorkEventArgs e) { } 我知道什么时候是worker.RunWorkerAsync();,我不知道如何在worker_DoWork中定义它应该采用int参数。

18
如何等待BackgroundWorker取消?
考虑一个 为您做事的对象假设方法: public class DoesStuff { BackgroundWorker _worker = new BackgroundWorker(); ... public void CancelDoingStuff() { _worker.CancelAsync(); //todo: Figure out a way to wait for BackgroundWorker to be cancelled. } } 一个人如何等待BackgroundWorker完成? 过去人们尝试过: while (_worker.IsBusy) { Sleep(100); } 但这僵局IsBusy是因为直到RunWorkerCompleted事件处理后才清除,并且该事件只有在应用程序进入空闲状态后才能得到处理。直到工作人员完成后,应用程序才会处于空闲状态。(此外,这是一个繁忙的循环-令人作呕。) 其他人则建议将其合并为: while (_worker.IsBusy) { Application.DoEvents(); } 这样做的问题是Application.DoEvents()导致当前队列中的消息被处理,从而导致重新输入问题(.NET不能重新输入)。 我希望使用一些涉及事件同步对象的解决方案,其中代码等待事件-工作者的RunWorkerCompleted事件处理程序设置的事件。就像是: Event _workerDoneEvent = …

2
任务并行库替换BackgroundWorker?
任务并行库中是否有任何东西被认为是对BackgroundWorker类的替代或改进? 我有一个带有向导式UI的WinForms应用程序,它执行一些长期运行的任务。我希望能够拥有一个带有标准进度条的响应式UI,并能够取消该操作。我之前使用BackgroundWorker做到了这一点,但是我想知道是否可以使用某些TPL模式来代替?

12
如何在Form的Closing事件中停止BackgroundWorker?
我有一个生成BackgroundWorker的表单,该表单应该更新表单自己的文本框(在主线程上),因此进行Invoke((Action) (...));调用。 如果HandleClosingEvent我真bgWorker.CancelAsync()那么我得到ObjectDisposedException的Invoke(...)电话,可以理解。但是,如果我坐在那里HandleClosingEvent等待bgWorker完成,那么.Invoke(...)永远不会返回,这也是可以理解的。 有什么想法如何关闭该应用程序而不会出现异常或死锁吗? 以下是简单的Form1类的3种相关方法: public Form1() { InitializeComponent(); Closing += HandleClosingEvent; this.bgWorker.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while (!this.bgWorker.CancellationPending) { Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); })); } } private void HandleClosingEvent(object sender, CancelEventArgs e) { this.bgWorker.CancelAsync(); /////// while (this.bgWorker.CancellationPending) {} // deadlock }

5
BackgroundWorker中未处理的异常
我的WinForms应用程序使用许多BackgroundWorker对象从数据库检索信息。我之所以使用BackgroundWorker,是因为它允许UI在长时间运行的数据库查询期间保持畅通无阻,并且为我简化了线程模型。 我在其中某些后台线程中偶尔遇到DatabaseException,并且在调试时目睹了在工作线程中至少有这些异常之一。我非常相信这些异常是超时,我认为它是不时会发生的合理事件。 我的问题是,在这些后台工作线程之一中发生未处理的异常时会发生什么。 我认为我无法在另一个线程中捕获异常,但是我可以期望执行我的WorkerCompleted方法吗?是否可以查询BackgroundWorker的任何属性或方法来处理异常?

5
BackgroundWorker中未处理的异常
我有一个小型的WinForms应用程序,该应用程序使用BackgroundWorker对象执行长时间运行的操作。 后台操作偶尔会引发异常,通常是当有人打开了正在重新创建的文件时。 不管代码是否从IDE运行,.NET都会弹出一个错误对话框,通知用户发生了未处理的异常。使用Release配置编译代码也不会对此进行更改。 根据MSDN: 如果该操作引发您的代码无法处理的异常,则BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该事件处理程序中将其公开为System.ComponentModel .. ::。RunWorkerCompletedEventArgs的Error属性。如果在Visual Studio调试器下运行,则调试器将在DoWork事件处理程序中引发未处理异常的点处中断。 我希望有时会抛出这些异常,并且希望在RunWorkerCompleted事件中而不是在DoWork中处理它们。我的代码正常运行,并且在RunWorkerCompleted事件中正确处理了错误,但是我终生无法弄清楚如何停止抱怨“未处理的异常”的.NET错误对话框。 BackgroundWorker是否应该自动捕获该错误?这不是MSDN文档说明的吗?我需要做什么做的通知.NET,这个错误是被处理,同时仍允许例外propage到RunWorkerCompletedEventArgs的错误属性?

8
如何正确停止BackgroundWorker
我有一个带有2个组合框的表单。我想combobox2.DataSource根据combobox1.Text和进行填写combobox2.Text(我假设用户已完成输入,combobox1并且处于输入的中间combobox2)。所以我有一个这样的事件处理程序combobox2: private void combobox2_TextChanged(object sender, EventArgs e) { if (cmbDataSourceExtractor.IsBusy) cmbDataSourceExtractor.CancelAsync(); var filledComboboxValues = new FilledComboboxValues{ V1 = combobox1.Text, V2 = combobox2.Text}; cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues ); } 至于构建DataSource是耗时的过程(它创建对数据库的请求并执行它),我认为最好使用BackgroundWorker在另一个过程中执行它。因此,有一种情况是cmbDataSourceExtractor尚未完成其工作,而用户又键入了一个符号。在这种情况下,我在此行上看​​到一个异常,原因 cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues );是BackgroundWorker很忙,无法同时执行多个操作。 如何摆脱这种例外? 提前致谢!

2
如何使用BackgroundWorker?
我知道它有3种方法。在我的程序中,我有一种发送消息的方法。这通常很晚,并且程序有时根本不发送响应按钮按下的消息。有时可能比我期望的要晚5秒钟,程序会冻结。我想使用aBackgroundWorker按预期方式发送消息,并允许程序始终正常运行。我有用于在按钮处理程序中发送消息的代码。现在,我将这些等效代码放在哪里?我希望所有这些仍然可以通过按按钮来处理。 这是合适的处理程序吗? backgroundWorker1.RunWorkerAsync(); 并在: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {} 我要把我的代码放在按钮处理程序中吗?而这之前: carga.progressBar1.Minimum = 0; carga.progressBar1.Maximum = 100; Carga是ProgressBar所在的另一种形式。在这种情况下如何使用BackgroundWorker?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.