Tag: backgroundworker

为BackgroundWorker设计接口

在我的Windows窗体应用程序中,我有一个扩展backgroundworker的类,让我们在我的表单类中将其称为ExtendedBGW1.cs我将其声明为成员变量,因此我有整个类的范围,如下所示: public partial class Main : Form { ExtendedBGW1 ebgw1; } 稍后在表单构造函数中,我这样做 public Main() { InitializeComponent(); ebgw1 = new ExtendedBGW1(); InitializeBackgoundWorker(); } 我的InitializeBackgroundWoker()方法看起来像这样 private void InitializeBackgoundWorker() { ebgw1.DoWork += new DoWorkEventHandler(ebgw1.worker_DoWork); ebgw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(processWorkerCompleted); ebgw1.ProgressChanged += new ProgressChangedEventHandler(processProgressChanged); ebgw1.WorkerReportsProgress = true; ebgw1.WorkerSupportsCancellation = true; } 现在是我的设计问题。 我现在知道我将有更多类,例如我的extenededBGW1.cs,它将扩展BackGroundWorker,所以我想如果我创建一个IExtenedBackGroundWorker,我可以做这样的事情。 public partial class Main : Form { […]

如何在C#backgroundworker中发送更多参数改进了事件

我理解如何将一个变量(progresspercentage)传递给“progresschanged”函数,就像这样。 backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); … worker.ReportProgress(pc); … private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; } 但我想将更多变量传递给此函数,有些事情如下: worker.ReportProgress(pc,username,score); … private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; this.currentUser.Value = e.UserName; //as string this.score.Value = e.UserScore; //as int } 抱歉,我是c#的新手,有人可以举个例子。

不是.NET 4.0 TPL使APM,EAP和BackgroundWorker异步模式过时了吗?

我有2种C#WPF应用程序项目: 基于.NET 4.0,我无法迁移到.NET 4.5 基于.NET 4.0,我可以迁移到.NET 4.5 所有这些都应该产生2-10个长时间运行(天)进程,这些进程可以被用户取消和重新启动。 我有兴趣遵循最佳设计实践。 首先,现在,我有兴趣消除有关BackgroundWorker用法的歧义,但我希望,我的问题应该对其他异步模式有效。 我看到(矛盾)并发的观点 异步编程模型(APM) 基于事件的异步模式(EAP) 的BackgroundWorker 异步模式: A).NET 4.5使它们过时了 在约瑟夫·阿尔巴哈里的书中,Ben Albahari在“ 过时模式 ”子章节中的“C#5.0 in a Nutshell:The Definitive Reference”中提到了这一点,而其上一版“C#4.0 in a Nutshell:The Definitive Reference”中没有 MSDN文章“使用异步和等待的异步编程(C#和Visual Basic)”告诉: “基于异步的异步编程方法几乎在所有情况下都优于现有方法。特别是,对于IO绑定操作,这种方法优于BackgroundWorker ,因为代码更简单,您无需防范竞争条件。与Task.Run结合使用,异步编程优于BackgroundWorker用于CPU绑定操作,因为异步编程将运行代码的协调细节与Task.Run传输到线程池的工作分开“ B)他们(或者至少是BackgroundWorker )在.NET 4.5中并没有过时 我仍有疑问: 这些模式(首先是BGW)在.NET 4.5中是否已过时? 如果它们在.NET 4.5中已经过时,为什么它们在.NET 4.0中不会过时? 2A)我是否错误地理解.NET 4.0新function在.NET 4.0中仍然“易于”实现/重现?

后台工作者exception处理

我对如何处理exception感到有些困惑。 我有一个后台工作线程,运行一些长时间运行的进程。 我的理解是,如果后台工作线程发生exception,代码仍将以RunWorkerCompleted方法结束。 void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw e.Error; 如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的。 打电话,我猜不是吗? 我想重新抛出RunWorkerCompleted方法中捕获的exception,如何在不丢失堆栈跟踪的情况下执行此操作 – 我的上述内容是否正确? 我读过你,当你重新抛出exception时,你应该只使用“抛出”?

执行SQL查询时显示进度条

我想在从SQL数据库中读取数据时通知用户,我决定创建一个带有进度条的表单,但它不起作用 – 可能是因为需要一个线程。 我想以编程方式创建表单 ProgressBar pb = new ProgressBar(); pb.MarqueeAnimationSpeed = 30; pb.Style = ProgressBarStyle.Marquee; pb.Dock = DockStyle.Fill; progressForm.ClientSize = new Size(200, 50); progressForm.FormBorderStyle = FormBorderStyle.FixedDialog; progressForm.StartPosition = FormStartPosition.CenterScreen; progressForm.Controls.Add(pb); progressForm.ControlBox = false; progressForm.TopMost = true; progressForm.Show(); //do data processes here (all queries and executes) progressForm.close(); 如何修改上面的代码以实现我的既定目标? 编辑:顺便说一下,我想在项目的每个数据函数中使用这个进度条表单。 例如:fillGrid,runQuery .. @Will非常感谢你的回答。 我的意思是我如何使用类的函数,例如我的gridFill函数在该连接类中: class ConnectionClass { […]

不止一次地重复使用背景工作者

我正在使用后台工作人员进行昂贵的操作: backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); backgroundWorker1.RunWorkerAsync(inputs); 最后我有这个: void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Messagebox.Show(“Done with expensive operation 1”}; } 我现在有另一个昂贵的操作。 我可以重用这个相同的后台工作者。 我现在想要新的回调,因为我不希望ProgressChanged和DoWork Callbacks上的switch语句确定我是在进行操作1还是2。 使用2个单独的后台工作者类是否更简单

关闭应用程序是否会停止所有活动的BackgroundWorkers?

简单的问题,重复标题: 关闭WinForms应用程序是否会停止所有活动的BackgroundWorkers?

异步/等待具有进度/取消的长时间运行的API方法

编辑我认为强制等待异步调用worker的正确方法是使用Task.Run,​​如下所示: await Task.Run(() => builder.Build(dlg.FileName, cts.Token, new Progress(ReportProgress))); 从http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/10293335.aspx获得了一些亮点。 这应该很容易,但我是async / await的新手,所以请耐心等待。 我正在构建一个类库,使用一些长时间运行的操作来公开API。 在过去,我使用BackgroundWorker来处理进度报告和取消,就像在这个简化的代码片段中一样: public void DoSomething(object sender, DoWorkEventArgs e) { BackgroundWorker bw = (BackgroundWorker)sender; // e.Argument is any object as passed by consumer via RunWorkerAsync… do { // … do something … // abort if requested if (bw.CancellationPending) { e.Cancel = true; break; } […]

C#我可以使用backgroundwork线程向列表框添加值吗?

我希望我的后台工作者将项目添加到列表框中,它在调试时似乎这样做,但列表框不显示值。 我怀疑这与在后台工作线程中添加项目有关,我是否需要将这些添加到数组中,然后在backgroundWorker1_RunWorkerCompleted期间从数组中填充列表框? 谢谢您的帮助。

背景工作者访问UI的正确方法

我不确定我是否正确地执行此操作,但是我使用了以下代码(单击button1,执行_DoWork)。 问题是:如何调用UI来获取textbox1和textbox2的值,因为它们不能被调用,因为它们位于不同的线程上。 我应该使用调度员吗? private void button1_Click(object sender, RoutedEventArgs e) { if (textBox1.Text == “”) { MessageBox.Show(“Please enter a username and password”, “Error”, MessageBoxButton.OK, MessageBoxImage.Warning); } else { bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerAsync(); } } private void bw_DoWork(object sender, DoWorkEventArgs e) { Console.WriteLine(“asd”); UserManagement um = new UserManagement(sm.GetServerConnectionString()); if (um.AuthUser(textBox1.Text, textBox2.Password)) { MainWindow mw = new […]