Tag: backgroundworker

如何在RunWorkerCompletedEventArgs对象中设置UserState?

大家好。 我有一组运行Worker类实例的BackgroundWorker对象。 当我调用Worker类时,对象实例会执行它然后用尽代码(循环结束)。 我能够收听RunWorkerCompleted()事件,但是当它调用我设置的委托时,我需要知道我的哪些Worker对象刚刚完成。 我在RunWorkerCompletedEventArgs中看到了一个UserState属性,该属性来自我的委托,但我不知道如何在我的Worker对象中设置它,因为它正在完成。 有任何想法吗? 来自我的WorkManager.cs类的片段 public Worker AddWorker() { Worker w = new Worker(); _workers.Add(w.WorkerID,w); BackgroundWorker bg = new BackgroundWorker(); _bgworkers.Add(bg); bg.DoWork += w.Start; bg.WorkerReportsProgress = true; bg.WorkerSupportsCancellation = true; bg.ProgressChanged += ProcessWorkerMessage; bg.RunWorkerCompleted += WorkerFinished; w.WorkManager = this; w.BackgroundWorker = bg; bg.RunWorkerAsync(w); return w; } public void WorkerFinished(object sender, RunWorkerCompletedEventArgs e) { […]

从BackgroundWorker线程更新Image UI属性

在我写的WPF应用程序中,我有一个TransformedBitmap属性,它绑定到UI上的Image对象。 每当我更改此属性时,图像都会更新(因此更新显示在屏幕上的图像)。 为了防止UI在我检索下一个图像时冻结或无响应,我正在尝试使用BackgroundWorker进行快照检索,如下所示: private void bw_DoWork(object sender, DoWorkEventArgs e) { e.Result = this.snapshotHelper.GetSnapshot(ImageFormat.Bmp); } 然后,在我的RunWorkerCompleted方法中,我有以下内容: private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.CurrentImage = (TransformedBitmap)e.Result; …. } 这似乎工作正常,直到我更新CurrentImage属性时用于告诉Image对象更新的NotifyPropertyChanged方法; 我得到一个跨线程错误。 public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { //The following causes a “the calling thread cannot access this object because […]

从WPF中的后台工作者更新进度条

我正在尝试使用BackgroundWorker进行进度条前进。 最终目标是显示后台搜索的进度,但我首先想要通过简单的模拟来了解进度条。 这是代码: public MainWindow() { InitializeComponent(); worker = new BackgroundWorker(); // variable declared in the class worker.WorkerReportsProgress = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); worker.RunWorkerCompleted += worker_RunWorkerCompleted; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.Title += ” DONE”; } private void worker_DoWork(object sender, DoWorkEventArgs e) { for(int j = 0; […]

同步调用BackgroundWorker

我想同步调用后台工作程序。 我希望在backgroundworker完成执行时执行代码。 我的BackgroundWorker代码在这里: { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += DoWork; worker.RunWorkerCompleted += RunWorkerCompleted; … worker.RunWorkerAsync(); //wait for execution to end } 一种方法是再次检查状态,直到执行完成,但有没有其他好方法呢?

后台工作者ReportProgress没有开火

我是第一次成立后台工作人员。 它主要是在代码运行时工作,我的停止/取消按钮正在工作。 但是,我也在尝试报告更新进度条的进度,但我根本无法解决这个问题。 我从点击按钮启动代码,运行此代码: backgroundWorker1.WorkerSupportsCancellation = true; backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.RunWorkerAsync();//this invokes the DoWork event 我的Do_Work方法: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; int j = 0;// Count cumulative imported files int countDupFiles = 0;// Count number of previously imported csv files int countImportedFiles = 0;// Count imported files […]

Backgroundworker中止

我最近尝试使用backgroundworker而不是“经典”线程,我意识到它至少对我来说,比解决方案更多的问题。 我有一个后台工作程序运行同步读取(在这种情况下来自serialPort)并在1个代码行中被阻止大约30秒,然后取消支持不是解决方案。 我看到如果应用程序此时关闭(使用十字按钮和Application.Exit()),该过程将永远保持僵尸。 我需要一种强制中止或杀死backgroundworker线程的方法。

如何处理BackgroundWorker线程中的exception?

在WPF应用程序中,我有一个有计算机的数据库访问任务,由计时器定期运行,此任务已在BackgroundWorker线程中执行。 当连接尝试失败时,我通过try_catch构造引发exception,我想更新UI线程中的状态栏文本。 在BackgroundWorker是否有一些prebuild事件构造用于实现它,比如DoWorkEventHandler或RunWorkerCompletedEventHandler ,可以用于此吗? 如果没有,怎么做得更好? 编辑(补充): 如果我想在RunWorkerCompletedEventHandler处理exception,使用e.Error参数,它不起作用。 如果我在BackgroundWorker线程中保留未处理的exception,则应用程序挂起并且调试器指向在BackgroundWorker线程内部执行的代码字符串,并说: 用户代码未处理exception 。 因此,在这种情况下,线程不会停止,向RunWorkerCompletedEventHandler发出信号,表示它因错误而停止,但整个应用程序停止工作。

BackgroundWorkerexception处理

我正在使用以下组件: 图书馆(引发例外) 测试我的日志记录的测试控制台 企业库exception处理应用程序块 企业库日志应用程序块 我正在使用backgroundworker调用库方法。 库会抛出exception,但永远不会调用RunWorkerCompleted处理程序。 捕获exception的唯一方法是使用try / catch块包围我的DoWork处理程序代码。 是否误解了RunWorkerCompletedEventArgs.Error属性? 是不是因为获得了BackgroundWorker捕获的exception? Codesample: static BackgroundWorker w = new BackgroundWorker(); w.DoWork += new DoWorkEventHandler(w_DoWork); w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.RunWorkerAsync(); static void w_DoWork(object sender, DoWorkEventArgs e) { MyClass m = new MyClass(); w.result = m.Compute(); } static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) […]

在Winforms的背景工作者装货屏幕

我有一个可以登录的表单,可能需要一段时间才能将数据加载到表单中。 因此,我想在加载表单时创建一个带有进度条的单独表单(loadScreen.cs)。 我在loadScreen.cs表单中尝试了这个: private void Form1_Load(object sender, EventArgs e) { worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); } void worker_DoWork(object sender, DoWorkEventArgs e) { int percentFinished = (int)e.Argument; while (!worker.CancellationPending && percentFinished < 100) { percentFinished++; worker.ReportProgress(percentFinished); System.Threading.Thread.Sleep(50); } e.Result […]

从BackgroundWorker C#更改控件的属性

我正在尝试从目录中加载一堆文件,并在加载时显示进度条状态,以及显示正在处理哪个文件的标签。 private void FileWorker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < Files.Length; i++) { Library.AddSong(Files[i]); FileWorker.ReportProgress(i); } } 目前它正确处理所有内容,并且进度条正确显示状态,但是当我尝试更改标签的文本(lblfile.text)时,它表示它无法更改不同线程上的控件。 有没有办法从Fileworker更改lblfile.text的文本?