观察下面的一段代码: var handler = GetTheRightHandler(); var bw = new BackgroundWorker(); bw.RunWorkerCompleted += OnAsyncOperationCompleted; bw.DoWork += OnDoWorkLoadChildren; bw.RunWorkerAsync(handler); 现在假设我想等到bw完成工作。 什么是正确的方法呢? 我的解决办法是: bool finished = false; var handler = GetTheRightHandler(); var bw = new BackgroundWorker(); bw.RunWorkerCompleted += (sender, args) => { OnAsyncOperationCompleted(sender, args); finished = true; }); bw.DoWork += OnDoWorkLoadChildren; bw.RunWorkerAsync(handler); int timeout = N; while (!finished […]
我得到这个错误,如果我点击一个button,启动backgroundworker两次。 This BackgroundWorker is currently busy and cannot run multiple tasks concurrently 我怎样才能避免这一点?
这将是一个正确的方式来处置BackGroundWorker? 我不确定在调用.Dispose()之前是否需要删除事件。 也是调用.Dispose()里面的RunWorkerCompleted委托可以做? public void RunProcessAsync(DateTime dumpDate) { BackgroundWorker worker = new BackgroundWorker(); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerAsync(dumpDate); } void worker_DoWork(object sender, DoWorkEventArgs e) { // Do Work here } void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.DoWork -= new DoWorkEventHandler(worker_DoWork); worker.Dispose(); […]
我正在编写一个Windows应用程序,它反复运行一系列数字IO操作。 当用户点击一个“START”button时,这个动作序列就开始了,后台工作者在backgroundWorker1_DoWork()中完成。 不过,有些情况下我得到“这个背景工作者正在忙着…….”的错误信息。 我正在考虑在代码中实现以下内容:在开始另一个操作序列之前,使用while循环“杀死”后台工作者: if (backgroundWorker1.IsBusy == true) { backgroundWorker1.CancelAsync(); while (backgroundWorker1.IsBusy == true) { backgroundWorker1.CancelAsync(); } backgroundWorker1.Dispose(); } backgroundWorker1.RunWorkerAsync(); 我想我主要担心的是,后台工作人员最终会被“杀害”吗? 如果有的话,完成它需要很长时间吗? 这个编码会让我陷入一个无限循环吗?
我需要使RunWorkerAsync()返回一个List<FileInfo> 。 我怎样才能从一个后台工作人员返回一个对象?
我有一个2combobox的forms。 我想要填充combobox2.DataSource基于combobox1.Text和combobox2.Text (我假设用户已经完成在combobox1input,并在combobox2input中间)。 所以我有一个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 ); } 至于构buildDataSource是耗时的过程(它创build一个对数据库的请求并执行它),我决定最好在另一个使用BackgroundWorker的进程中执行它。 因此,当cmbDataSourceExtractor尚未完成其工作并且用户再次input一个符号时,就会出现这种情况。 在这种情况下,我在这一行上得到一个exception cmbDataSourceExtractor.RunWorkerAsync(filledComboboxValues ); 关于BackgroundWorker繁忙,不能在同一时间执行多个操作。 如何摆脱这个exception? 提前致谢!
只是想就multithreading任务的“最佳实践”提出一些build议。 作为一个例子,我们有一个C#应用程序,它在启动时从我们数据库中的各种“types”表中读取数据,并将这些信息存储在我们传递给应用程序的集合中。 这会阻止我们在每次需要这些信息时都敲击数据库。 目前应用程序正在同步从10个表中读取数据。 我真的希望从不同的线程中的每个表中读取应用程序并行运行。 在继续启动应用程序之前,应用程序会等待所有线程完成。 我已经看了BackGroundWorker,但只是想完成上述一些build议。 该方法听起来是合乎逻辑的,以加快我们的应用程序的启动时间 我们怎样才能最好地处理所有的线程,牢记每个线程的工作是相互独立的,我们只需要等待所有的线程完成,然后继续。 我期待着一些答案
任务并行库是否有什么可以被认为是对BackgroundWorker类的替代或改进? 我有一个向导式UI的WinForms应用程序,它执行一些长时间运行的任务。 我希望能够有一个标准的进度条响应式的用户界面和取消操作的能力。 我之前用BackgroundWorker做过这个,但是我想知道是否有一些TPL模式可以用来代替?
考虑一个假设的对象的方法,为你做的东西: 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); } 但是, 这种死锁 ,因为在处理RunWorkerCompleted事件之前, IsBusy不会被清除,并且该事件在应用程序空闲之前无法处理。 应用程序不会闲置,直到工人完成。 (另外,这是一个繁忙的循环 – 恶心)。 其他人已经添加了build议: while (_worker.IsBusy) { Application.DoEvents(); } 这个问题就是Application.DoEvents()导致当前队列中的消息被处理,从而导致重入问题(.NET不可重入)。 我希望使用一些涉及事件同步对象的解决scheme,其中代码等待事件 – 工作人员的RunWorkerCompleted事件处理程序设置。 […]
比方说,我想发送一个int参数给后台工作人员,这怎么能完成呢? private void worker_DoWork(object sender, DoWorkEventArgs e) { } 我知道什么时候这是worker.RunWorkerAsync();我不明白如何在worker_DoWork中定义它应该采取一个int参数。