Tag: backgroundworker

在WPF中使用BackgroundWorker更新UI

我目前正在编写一个简单的WPF 3.5应用程序,该应用程序利用SharePoint COM调用SharePoint站点并生成组和用户信息。 由于此过程需要一段时间,因此我希望在生成组时显示ProgressBar。 期望的过程如下: 用户输入url并单击按钮以获取站点数据。 ProgressBar开始动画 生成组并将名称添加到ListView 完成后,ProgressBar动画结束 我遇到的问题是UI永远不会更新。 ProgressBar或ListView都不做任何更改。 如果有人有任何想法来帮助下面的代码,将不胜感激。 private void GetGroupsAndUsersButton_Click(object sender, RoutedEventArgs e) { siteUrl = “”; if (SiteURLTextBox.Text.Length > 0) { FetchDataProgressBar.IsIndeterminate = true; mWorker = new BackgroundWorker(); mWorker.DoWork += new DoWorkEventHandler(worker_DoWork); mWorker.WorkerSupportsCancellation = true; mWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); mWorker.RunWorkerAsync(); } else { System.Windows.MessageBox.Show(“Please enter a URL for the […]

C#后台工作者在DoWork中设置e.Result并在WorkCompleted中获取值

C#2008 SP1 我正在使用后台工作者 如果其中一个条件失败,我将e.cancel设置为true,并将字符串分配给e.result。 一切都在那里工作。 但是,当workCompleted触发时,我测试了e.Result并且我得到一个exception“e.result抛出systeminvalidoperation类型的exception”。 我想我可以使用全局变量在DoWork中设置并在完成的工作中进行比较。 但这可能不是线程安全的。 任何人都可以告诉我为什么我用e.Result得到这个,我该如何解决这个问题? 非常感谢, private void bgwPrepareCall_DoWork(object sender, DoWorkEventArgs e) { // Check to see if the called number is blocked. // If the nubmer is blocked display error message. if (this.IsNoGateway(sipUsername, statusDisplay1.PhoneNumber)) { // this.SetIdleState(DialerErrorMessage.GetErrorDescription(12)); e.Cancel = true; e.Result = “NoGateway”; return; } if (!this.IsInvalidTelephoneNumber(sipUsername, statusDisplay1.PhoneNumber)) { // […]

为什么BackgroundWorker总是很忙?

我在WPF应用程序中的后台工作者中发现了一些奇怪的东西。 我现在要完成的是等到BW完成另一个线程。 检查以下代码: if (bw.IsBusy) { bw.CancelAsync(); System.Threading.ThreadStart WaitThread = new System.Threading.ThreadStart(delegate() { while (bw.IsBusy) { System.Threading.Thread.Sleep(100); } bw.RunWorkerAsync(); }); System.Windows.Application.Current.Dispatcher.Invoke( System.Windows.Threading.DispatcherPriority.Normal, WaitThread); // if I remove this line, bw fires RunWorkerAsyncEvent } else { bw.RunWorkerAsync(); } 请注意,我添加了Dispatcher.Invoke以等待bw不忙,但如果我调用它并且从不触发RunWorkerAsyncCompleted事件,则所有时间都很忙。 虽然,如果我删除该行,FIRES事件,这真的很奇怪。 我怎么能等到bw结束?

背景工作者 – 报告与字符串数组的进展

我需要在每个循环中从我的backgroundworker返回多个STRING值,所以我尝试使用ReportProgress第二个参数作为字符串数组。 代码示例: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string[] workerResult = new string[2]; for (int i=0; i<someNumber; i++) { //do some heavy calculating workerResult[0] = "this string"; workerResult[1] = "some other string"; backgroundWorker1.ReportProgress(i, workerResult) // also tried workerResult[] and [2] } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { string[] results = (string[])e.UserState; MessageBox.Show(results[0]); […]

带参数的基本BackgroundWorker用法

我想要在后台线程中执行的进程密集型方法调用如下所示: object.Method(paramObj, paramObj2); 所有这三个对象都是我创建的对象。 现在,从我看到的最初示例中,您可以将对象传递给后台工作者的DoWork方法。 但是,如果我需要将额外的参数传递给该对象,我应该怎么做呢,就像我在这里做的那样? 我可以将它包装在一个对象中并完成它,但我认为在其他人的输入上是明智的。

重用BackgroundWorker,取消并等待它

假设您有一个搜索文本框并且具有附加到TextChanged事件的搜索算法,该事件与BackgroundWorker一起运行。 如果文本框中出现了新字符,我需要取消之前的搜索并再次运行。 我尝试在主线程和bgw之间使用事件, 从前一个问题 ,但我仍然得到错误“当前很忙,不能同时运行多个任务” BackgroundWorker bgw_Search = new BackgroundWorker(); bgw_Search.DoWork += new DoWorkEventHandler(bgw_Search_DoWork); private AutoResetEvent _resetEvent = new AutoResetEvent(false); private void txtSearch_TextChanged(object sender, EventArgs e) { SearchWithBgw(); } private void SearchWithBgw() { // cancel previous search if (bgw_Search.IsBusy) { bgw_Search.CancelAsync(); // wait for the bgw to finish, so it can be reused. _resetEvent.WaitOne(); // […]

在BackgroundWorker中调用ShowDialog

我有一个WinForms应用程序,我的后台工作人员在其中执行同步任务,添加新文件,删除旧文件等。 在我的后台工作者代码中,我想向用户显示一个自定义表单,告诉他将删除什么以及如果他继续将添加什么,使用YES / NO按钮获取他的反馈。 我想知道在后台工作者的doWork方法中做这样的事情是否可行? 如果没有,我该怎么办? 请指教.. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { MyForm f = new MyForm(); f.FilesToAddDelete(..); DialogResult result = f.ShowDialog(); if(No…) return; else //keep working… }

如何在C#中使用BackgroundWorker

如何在C#中使用BackgroundWorker? 实际上我正在执行一个从fill()方法填充PDF表单的操作。 将结果显示到pdfviewer需要更多时间,因此我决定使用backgroundworker显示“处理图像”,并尝试使用它但未能实现它 这是我的代码片段: private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e) { this.Invoke((MethodInvoker)delegate() { ???? }); } private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { } else if (e.Error != null) { } else { picLoading.SendToBack(); } } 单击按钮FILL时调用填充方法 private void btnFill_Click(object sender, EventArgs e) { if (btnFill.Text == “Fill”) { bgwLoadFile.RunWorkerAsync(); […]

BackgroundWorker OnWorkCompleted抛出跨线程exception

我有一个简单的UserControl用于数据库分页,它使用控制器来执行实际的DAL调用。 我使用BackgroundWorker来执行繁重的工作,并在OnWorkCompleted事件上重新启用一些按钮,更改TextBox.Text属性并为父窗体引发事件。 表单A保存我的UserControl。 当我点击打开表单B的某个按钮时,即使我没有做任何“那里”并且只是关闭它,并尝试从我的数据库引入下一页, OnWorkCompleted会在工作线程上调用(而不是我的主线程),并抛出一个跨线程exception。 目前我在那里的处理程序中添加了对InvokeRequired的检查,但是不是要在主线程上调用OnWorkCompleted的全部内容吗? 为什么不按预期工作? 编辑: 我设法将问题缩小到arcgis和BackgroundWorker 。 我有以下解决方案,它向arcmap添加一个命令,打开一个带有两个按钮的简单Form1 。 第一个按钮运行一个hibernate500毫秒的BackgroundWorker并更新计数器。 在RunWorkerCompleted方法中,它检查InvokeRequired ,并更新标题以显示方法最初在主线程或工作线程内运行。 第二个按钮只打开Form2 ,它什么都不包含。 首先,所有对RunWorkerCompletedare的调用都是在主线程内完成的(正如预期的那样 – 这就是RunWorkerComplete方法的最后一点,至少我从BackgroundWorker上的MSDN中了解到的) 打开和关闭Form2 ,始终在工作线程上调用RunWorkerCompleted 。 我想补充一点,我可以将此解决方案保留原样(在RunWorkerCompleted方法中检查InvokeRequired ),但我想了解为什么它会违背我的期望。 在我的“真实”代码中,我想知道在主线程上调用RunWorkerCompleted方法。 我设法在form.Show(); 我的BackgroundTesterBtn命令 – 如果我使用ShowDialog() ,我没有问题( RunWorkerCompleted总是在主线程上运行)。 我需要在我的ArcMap项目中使用Show() ,这样用户就不会绑定到表单了。 我还尝试在正常的WinForms项目上重现该错误。 我添加了一个简单的项目,只打开没有ArcMap的第一个表单,但在这种情况下我无法重现该错误 – RunWorkerCompleted在主线程上运行,无论我在打开Form2之前和之后使用Show()或ShowDialog() 。 我尝试在Form1之前添加第三个表单作为主表单,但它没有改变结果。 这是我的简单sln(VS2005sp1) – 它需要 ESRI.ArcGIS.ADF(9.2.4.1420) ESRI.ArcGIS.ArcMapUI(9.2.3.1380) ESRI.ArcGIS.SystemUI(9.2.3.1380)

更新背景工人winforms中的标签文本

我正在使用BackGroundWorker类在sqlserver中插入一些值。 我在这里循环插入值。 我正在使用以下代码 public void bw_Convert_DoWork(object sender, DoWorkEventArgs e) { e.Result = e.Argument; for (int i = 0; i < fTable.Rows.Count; i++) { try { SqlCommand cmd = new SqlCommand("INSERT INTO TBL_CDR_ANALYZER (LNG_UPLOAD_ID, DAT_START, LNG_DURATION, INT_DIRECTION, INT_CALL_DATA_TYPE, \n" + "TXT_TARGET_NUMBER, TXT_OTHER_PARTY_NUMBER, TXT_TARGET_IMSI, TXT_TARGET_IMEI, TXT_TARGET_CELL_ID, TXT_ROAMING_NETWORK_COMPANY_NAME) VALUES \n" + "(@UPLOAD_ID, @START_DATE, @DURATION, @DIRECTION, @CALL_TYPE, @TARGET_NUMBER, @OTHER_PARTY_NUMBER, […]