Tag: backgroundworker

BackgroundWorker – 在RunWorkerCompleted中CancellationPending更改为false。 为什么?

取消BackGroundWorker后,在DoWork中,CancellationPending为true,但当他进入RunWorkerCompleted时,CancellationPending为false。 我不知道我做错了什么? static BackgroundWorker b1; static void Main(string[] args) { b1=new BackgroundWorker(); b1.DoWork += new DoWorkEventHandler(work1); b1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(completed); b1.WorkerSupportsCancellation = true; b1.RunWorkerAsync(“Hellow”); Console.ReadLine(); } private static void completed(object sender, RunWorkerCompletedEventArgs e) { if (((BackgroundWorker)sender).CancellationPending) Console.WriteLine(“Canceled!”); else Console.WriteLine(“Result:” + e.Result);//it goes here every time } private static void work1(object sender, DoWorkEventArgs e) { ((BackgroundWorker)sender).CancelAsync(); […]

如何在使用后台工作时正确处理表单关闭?

我在一些代码中观察到一个奇怪的错误,我怀疑它与关闭表单和后台工作者交互的方式有关。 以下是可能出错的代码: var worker = new BackgroundWorker(); worker.DoWork += (sender, args) => { command(); }; worker.RunWorkerCompleted += (sender, args) => { cleanup(); if (args.Error != null) MessageBox.Show(“…”, “…”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }; worker.RunWorkerAsync(); 当按下按钮时,该代码在表单中的方法中执行。 command()很慢,可能需要几秒钟才能运行。 用户按下执行上述代码的按钮以执行。 在完成之前,表单已关闭。 问题是调用cleanup() 有时会引发ObjectDisposedException。 我说“有时”,因为这在我的电脑上永远不会发生。 如果在完成command()之前关闭了表单,则不会执行我为RunWorkerCompleted注册的处理程序。 在另一台计算机上,处理程序一次被调用一次。 在同事的电脑上,它几乎总是被称为。 显然,处理程序的执行概率随着计算机的年龄/速度而增加。 第一个问题: 这是BakgroundWorker的预期行为吗? 我不希望它对forms有任何了解,因为我看不到任何与“工人”相关的forms。 第二个问题: 我该如何解决这个问题呢? 我正在考虑可能的解决方案: 在调用cleanup()之前测试是否(!this.IsDisposed)。 这还不够,还是可以在执行清理时处理表单? 在try {} catch(ObjectDisposedException)中调用cleanup()。 我不太喜欢这种方法,因为我可能会捕获由于cleanup()中的一些其他无关错误或它调用的方法之一而引发的exception。 […]

未处理的exception未在C#中捕获

我使用以下代码来处理程序中的所有未处理的exception。 但是exception没有传播到指定方法的问题。 [STAThread] static void Main() { AppDomain currentDomain = default(AppDomain); currentDomain = AppDomain.CurrentDomain; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // Handler for unhandled exceptions. currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; // Handler for exceptions in threads behind forms. System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) { Exception ex = (Exception)e.ExceptionObject; MessageBox.Show(ex.Message, “Important”, MessageBoxButtons.YesNo); } […]

如何在c#中指定的时间后取消后台工作程序

如何在c#中指定时间后取消后台工作程序或取消不响应后台工作程序。

WPF C#应用程序将使我的整个计算机冻结2-3次我运行它

我在这个问题上提供了大量信息,因为我不知道会有什么相关性 问题: 我正在处理我正在处理的程序的问题,在运行它时,它会冻结我的整个计算机并且不会返回任何错误(我完全无法做任何事情CTRL + ALT + DEL甚至不起作用)。 此程序接受来自Android客户端的连接,并且atm未正确配置android客户端,因此连接被拒绝。 题: 如何阻止我的程序冻结我的整个机器? 推测: 我有一些关于发生了什么的理论,但不知道如何解决它们。 我已经读过这可能与我在异步工作程序中运行单线程进程有关,但我不确定套接字是单线程进程。 此外,我不完全确定我应该如何处理后台工作程序中的exception,所以我只是让它回退到RunWorkerCompletedEventArgs然后从那里检索错误消息。 我试过的: – 我尝试在每个地方尝试捕获然后删除尝试捕获似乎没有能够捕获此错误 – 我检查了我的系统事件日志,除了我的计算机冻结后重新启动以外什么都没有显示 – 我试图隔离这个问题,但它可以从程序开始到我尝试连接的任何时候发生 建立: 我在Windows 8 Pro机器上运行visual studio 2012专业人员的程序。 我所用的电脑有一个i7-3770K 3.50GHz和32GB的内存。 尝试与我的连接的应用程序是Android应用程序,并且在尝试连接时凭据不正确。 Visual Studio正在运行我的主硬盘驱动器并在另一个驱动器上构建项目。 收盘: 尽管如此,有人愿意帮助我吗? 如果您需要更多信息,我很乐意提供,请询问。 主要方法: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using […]

在BackgroundWorker和主线程之间共享对象

我的主线程(WPF应用程序)中有一个ListBox对象。 为什么我无法在BackgroundWorker线程中访问它。 据我所知,每个线程的堆栈是分开的,但堆很常见。 不是在堆中创建ListBox对象。 在那种情况下,为什么它无法访问。 我尝试将ListBox引用作为参数传递,并尝试在BackgroundWorker中访问其内容。 在线程之间共享对象的概念是否与C ++不同?

C#后台工作者除了我自己以外没有触发任何电脑上的dowork事件

我的一个应用程序中的后台工作者有一个非常奇怪的问题。 我最近稍微修改了一些GUI修复程序但现在当另一台PC上的某人运行.exe或安装我的OneClick部署时,后台工作程序不会进入dowork事件。 两个版本之间的逻辑没有改变。 我做了一个比较,除了添加更多的错误记录,没有任何改变。 我已经在dowork事件中包含了消息框和断点,但除了在我自己的PC上之外,它从未进入任何地方。 即使我远程调试它也不会进入DoWork事件 有什么建议? 按钮单击甚至调用runworkerasync事件 private void ScanButton_Click_1(object sender, RoutedEventArgs e) { Scan = new BackgroundWorker(); Scan.WorkerReportsProgress = true; Scan.DoWork += new DoWorkEventHandler(Scan_DoWork); Scan.ProgressChanged += new ProgressChangedEventHandler(Scan_ProgressChanged); Scan.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Scan_RunWorkerCompleted); Scan.RunWorkerAsync(); } 下面是运行DoWork事件的代码。 我已经删除了它为简单起见所做的其他function。 它所做的就是运行一个函数,该函数返回一个字符串并将其放在名为scanresults的列表中。 private BackgroundWorker Scan; public void Scan_DoWork(object sender, DoWorkEventArgs e) { System.Windows.Forms.MessageBox.Show(“Inside the DoWork”); BackgroundWorker bw = […]

C#后台工作者更新状态标签

这应该是一件相当简单的事情; 但是,我一直无法弄清楚这一点。 /// This section is located in the InitializeComponent() method /// form’s class, ie partial class frmMain { …. } this.bgw = new System.ComponentModel.BackgroundWorker(); this.bgw.WorkerReportsProgress = true; this.bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_DoWork); this.bgw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged); /// This code is located in public partial class frmMain : Form { …. } private void bgw_DoWork(object sender, […]

在调用RunWorkerAsync之后但在函数退出之前取消订阅DoWork是否安全?

我有很多方法(它们一次只运行一个),它们都使用相同的RunWorkerCompleated和ProgressChanged方法,但它们都有不同的Dowork方法。 执行以下操作是否安全: private void button_Process_Click(object sender, EventArgs e) { bgWork_Process.DoWork += Scrub_DoWork; bgWork_Process.RunWorkerAsync(); bgWork_Process.DoWork -= Scrub_DoWork; } 或者我能做到这样的边缘案例? 我没有在MSDN上看到任何关于它的信息,说这是不允许的,并且它(到目前为止)在我的程序中正常运行,但我想在这里查看是否有人遇到麻烦这样做。

C# – 使用BackgroundWorker中的控件填充Panel

所以我正在写一个小的Twitter客户端供我使用。 我正在使用一个大面板的组合,较小的面板代表各个推文。 在每个较小的面板中,我有一个PictureBox和一个RichTextBox。 现在,我的问题是加载超过10条推文会导致速度减慢,因为我正在动态生成面板。 所以我决定使用BackgroundWorker执行此操作,然后将这些面板添加到主面板。 我已经多次这样做了,将文本写入来自不同thead的文本框(甚至在其上编写了教程)。 然而,我无法让它发挥作用。 我收到错误消息: Cross-thread operation not valid: Control ” accessed from a thread other than the thread it was created on. 码: List panelList = new List(); foreach (UserStatus friendStatus in list) { PictureBox pbTweet = new PictureBox(); // … // code to set numerous properties // … RichTextBox rtbTweet […]