Tag: backgroundworker

C#中的后台工作者

实际上,我需要提示加载图像throwugh backgrounderworker,每当调用一个特定的函数是我的代码: private void bgwFile_DoWork(object sender, DoWorkEventArgs e) { FormFieldsLoad(); } private void bgwFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { Status.Text = “cancelled”; } else if (e.Error != null) { } picprocess.SendToBack(); Status.Text = “Completed”; } //Below Method where i have called RunWorkerAsync() private void buttonUpload_Click(object sender, EventArgs e) { LoadFile(pdfFullPath, txtPassword.Text); […]

后台工作程序:确保在执行RunWorkerCompleted之前已完成ProgressChanged方法

我们假设我正在使用后台工作器,我有以下方法: private void bw_DoWork(object sender, DoWorkEventArgs e) { finalData = MyWork(sender as BackgroundWorker, e); } private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { int i = e.ProgressPercentage; // Missused for i Debug.Print(“BW Progress Changed Begin, i: ” + i + “, ThreadId: ” + Thread.CurrentThread.ManagedThreadId); // I use this to update a table and an XY-Plot, […]

BackgroundWorker取消

我在winforms应用程序中使用BackgroundWorker来执行在另一个类中执行的长时间运行的任务(执行数据库操作)。 由于所有工作都在另一个class级完成,因此取消并不那么简单。 我在另一个类( GenerateStats )中使用一个事件来在后台操作完成时更新进度。 我想取消操作做类似的事情。 我不能只在DoWork函数中调用cancellationPending ,因为该方法在完成之前永远不会看到它并且会破坏目的。 我希望取消function,而无需将BackgroundWorker传递给generateForSubject() 。 无论如何,这可以支持从GenerateStats类中的generateForSubject()方法取消。 这是操作执行的类的实例化: GenerateStats genStats = new GenerateStats(); 这是我的DoWork函数,它可以在调用其他类中的事件时调用ReportProgress方法。 它还从执行操作的其他类generateForSubject()调用该方法。 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; genStats.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage, pe.UserState); genStats.generateForSubject(); } 这是应该启动取消并运行CancelAsync()的按钮单击事件处理程序 private void btnStop_Click(object sender, EventArgs e) { if (backgroundWorker.IsBusy) { backgroundWorker.CancelAsync(); } } […]

进程完成后,C#BackGroundWorker与ProgressBar更新

我在按钮点击事件中有以下内容: private void buttonSubmitAchChecks_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy) return; SubmittingAch(true); backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; label_Status.Text = “Submitting checks to ACH ….”; var qry = from ds in checkTrans.IndividualCheck where ds.SubmitToACH && ds.Status == “Entered” && ds.CheckAmount > 0 && ds.SubmitToACH select ds; if (qry.Count() <= 0) { label_Status.Text = "Nothing to […]

函数中的InvalidAsynchronousStateException检查控件是否需要调用

我使用Stack Overflow用户提供的这个function来更新BackgroundWorker控件。 static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action) { // If the invoke is not required, then invoke here and get out. if (!sync.InvokeRequired) { // Execute action. action(); // Get out. return; } // Marshal to the required thread. sync.Invoke(action, new object[] { }); } 这个function到目前为止一直运作良好。 我刚刚遇到这个例外: 这是什么意思,我该如何预防呢?

C#BackgroundWorker和Com端口问题

好。 我有一个监控2个COM端口的程序。 一个连接到秤,另一个连接到modbus板。 我的问题是连接到modbus板的COM端口。 我的程序每100MS读一个传感器(在modbus板上)。 它返回0或1(通过COM端口)以确定传感器是否被阻塞。 如果它被阻止,则通过端口向板发送信号。 我的问题是我无法退出监控传感器,但在发送其他信号之前我必须确保com端口未被使用。 监视传感器的例程在后台工作线程上。 一旦传感器跳闸,产生另一个线程,向Modbus板发送信号。 所以当我向电路板发送信号时,我需要暂停“传感器线程”。 我该怎么做呢? 请记住它是BackgroundWorker,因此Thread.Join不是一个选项。 这是我的代码: private void SensorThread_DoWork(object sender, DoWorkEventArgs e) { if (SensorThread.CancellationPending == true) e.Cancel = true; else { ReadSensor(); } } 此线程的RunWorkerCompleted只是重新启动线程。 以下线程持续监视“sensorstatus”以查看传感器何时被阻塞: public void ScaleThread_DoWork(object sender, DoWorkEventArgs e) { if (ScaleThread.CancellationPending == true) { e.Cancel = true; } else { //sensor is […]

正确加载后台线程上的文档

从我编写的应用程序和我inheritance的应用程序开始,我一直希望更好地理解在后台线程上加载数据的线程安全问题。 假设我有一个简单的单窗口Windows窗体应用程序,带有“加载”按钮和BackgroundWorker : 按钮的Click处理程序调用loadBackgroundWorker.RunWorkerAsync() ,并且worker的DoWork处理程序创建并初始化Document类型的对象,该对象在加载后存储在表单的LoadedDocument属性中。 在worker的RunWorkerCompleted处理程序中, MessageBox显示LoadedDocument的属性。 我知道这很难想象,所以我要包含完整的代码。 很抱歉,这个问题需要很长时间才能阅读。 这是表单的代码: using System; using System.ComponentModel; using System.Windows.Forms; namespace BackgroundLoadTest { public partial class Form1 : Form { private Document _loadedDocument; public Document LoadedDocument { get { lock (this) { return _loadedDocument; } } set { lock (this) { _loadedDocument = value; } } } public Form1() […]

填写dataGridView谢谢backGroundWorker

我有这段代码: private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { remplirDataGrid(); } private void frmChercherActesLoad(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } private void remplirDataGrid() { dataGridView1.DataSource = ActeServices.getAllActes(0, 40); dataGridView1.Columns[0].Visible = false; dataGridView1.Columns[1].HeaderText = “Code acte”; dataGridView1.Columns[2].HeaderText = “Désignation”; dataGridView1.Columns[3].HeaderText = “Pris en charge”; dataGridView1.Columns[4].HeaderText = “Id article”; dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); } 这是方法getAllActe : public static IEnumerable getAllActes(int skipCount, […]

如何立即取消正在运行的BackgroundWorker?

我有时间在BackgroundWorker DoWork中处理过程。 每当我尝试通过backgroundWorker1.CancelAsync()取消作业时, backgroundWorker1.CancellationPending变为Pending,我应该等待DoWork的下一次迭代取消作业并自行退出。 有没有办法在打电话后立即取消工作?

是否在后台工作者调用之间保留了线程本地存储?

后台工作线程是否重复使用? 具体来说,如果我在后台工作者的DoWork()方法期间设置了一个命名数据槽(线程本地存储),那么该数据槽的值是否会持续存在,以后可能会发现某个其他线程? 我不会这么想,但我有这个错误…… 编辑: 这篇博文建议BackGroundWorker使用ThreadPool ,这意味着线程被重用。 所以问题就变成了; 重用线程是否可能在调用之间持久保存线程本地存储?