Tag: backgroundworker

C#多个BackgroundWorkers

我正在尝试设置多个BackgroundWorker来完成工作,并且在不忙的时候开始做下一部分工作。 我似乎无法让他们正常工作。 我有以下代码。 当我将FilesToProcess设置FilesToProcess等于或小于MaxThreads它可以完美地工作,但如果我将其设置得更高,则该应用会冻结。 我确信这很简单,但我看不到它。 谢谢你的帮助 :) 松鸦 using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms; namespace bgwtest { public partial class Form1 : Form { private const int MaxThreads = 20; private const int FilesToProcess = 21; private BackgroundWorker[] threadArray = new BackgroundWorker[MaxThreads]; public Form1() { InitializeComponent(); } private void Form1Load(object sender, EventArgs e) […]

BackgroundWorker读取数据库和更新GUI

当我查询数据库并在BackgroundWorker中的DoWork中更新DataGrid ,我试图保持我的不确定ProgressBar动画顺利运行。 我知道我无法在DoWork更新UIThread,所以我使用Dispatcher.BeginInvoke来访问DataGrid ,但我仍然收到了由另一个线程拥有的exception。 问题1 为什么会这样? DoWork应该在UIThread拥有的BackgroundWorker的线程上,Dispatcher应该允许我的DoWork访问我的GUI。 进一步研究BackgroundWorker建议应该在ProgressChanged()处理UI操作。 但是,如果我将所有数据库/ GUI操作移动到ProgressChanged()并在DoWork() Thread.Sleep(5000)上放置一个Thread.Sleep(5000)来模拟某些东西,以便为ProgressChanged()提供足够的时间来运行,那么GUI就不会被更新,虽然ProgressBar继续其不确定的平滑动画。 问题2 我在BackgroundWorker线程上调用了Thread.Sleep(5000)。 ProgressChanged()应该花5秒时间查询数据库并更新GUI。 为什么不? XAML: Search C# private BackgroundWorker bgw = new BackgroundWorker(); private void btnSearch_Click(object sendoer, RoutedEventArgs e) { bgw.WorkerReportsProgress = true; bgw.ProgressChanged += ProgressChanged; bgw.DoWork += DoWork; bgw.RunWorkerCompleted += BGW_RunWorkerCompleted; bgw.RunWorkerAsync(); } private void DoWork(object sender, DoWorkEventArgs e) { // Thread.Sleep(5000); using […]

如何从BackgroundWorker线程中更新标签?

当我使用WinForms时,我会在我的bg_DoWork方法中完成此bg_DoWork : status.Invoke(new Action(() => { status.Content = e.ToString(); })); status.Invoke(new Action(() => { status.Refresh(); })); 但是在我的WPF应用程序中,我收到一条错误,指出Label不存在Invoke 。 任何帮助,将不胜感激。

C#/ WPF – 我无法从后台工作者更新UI

我有一个代码,使用Tweetsharp库从特定的Twitter帐户获取推文,创建自定义UserControl实例,并将推文文本发布到该UserControl然后将其添加到StackPanel 。 但是,我必须得到很多推文,似乎应用程序会在向StackPanel添加用户控件时冻结。 我尝试过使用BackgroundWorker ,但直到现在我还不幸运。 我的代码: private readonly BackgroundWorker worker = new BackgroundWorker(); // This ( UserControl ) is used in the MainWindow.xaml private void UserControl_Loaded_1(object sender, RoutedEventArgs e) { worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.RunWorkerAsync(); } private void worker_DoWork(object sender, DoWorkEventArgs e) { int usrID; var service = new TwitterService(ConsumerKey, ConsumerSecret); service.AuthenticateWith(AccessToken, AccessTokenSecret); […]

BackgroundWorker还需要调用Invoke吗?

在C#中做一些工作的最后一个问题显示进度条? ,人们建议使用BackgroundWorker 。 我认为在BackgroundWorker DoWork方法中你可以直接更新GUI,但是为什么需要使用Invoke来Invoke这个函数Invoke 。 toolTip.SetToolTip(button, toolTipText);

使用MVP架构的WinForms中BackGroundWorker的最佳实践

我正在开展一个winforms项目。 我正在实现一个MVP架构。 我在演示者处运行了一些处理密集型作业(从文件系统读取并对数据库执行批量插入)。 我想在后台线程中执行这些操作,而不会锁定UI并更新我的视图上的控件(进度条和datagridview)。 我应该只是通过让视图事件处理程序触发演示者正在侦听的事件来访问演示者中的backgroundworker对象并在演示者中处理它的事件吗? 例如: 在视图中: private void backgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { if (WorkerProgressChange != null) { WorkerProgressChange(this, EventArgs.Empty); } } 在演示者中: _view.WorkerProgressChange += UpdateView; 这看起来合情合理吗? 有人能提供更好的模特吗? 谢谢!

为什么BackgroundWorker不需要在ProgressChanged事件处理程序中调用?

由于ProgressChanged事件处理程序是从DoWork事件处理程序中的某个位置引发的,因此它们不应该在异步操作线程上调用, DoWork也运行,而不是UI线程,因此需要Invoke或BeginInvoke来操作控件? 我的猜测是在ReportProgress方法中发生了一些魔法,但它怎么知道,哪一个是调用ProgressChanged事件处理程序的正确线程?

在WPF中使用计时器刷新UI(使用BackgroundWorker?)

我们在WPF中有一个应用程序,通过ObservableCollection显示数据。 5分钟后,我想刷新数据。 我以为我可以将System.Timers.Timer对象用于其Elapsed事件,然后调用BackgroundWorker来调用启动作业的方法。 该方法位于ViewModel类上。 但似乎线程存在问题。 所以我尝试了Dispatcher,但同样的事情。 这是我的(简化和未优化)代码: /// /// Initializes a new instance of the class. /// public ApplicationController() { CreateDefaultTabs(); Timer timer = new Timer(20000); //20 secs for testing purpose. timer.AutoReset = true; timer.Enabled = true; timer.Elapsed += new ElapsedEventHandler(OnTimeBeforeRefreshElapsed); timer.Start(); } private void OnTimeBeforeRefreshElapsed(object sender, ElapsedEventArgs e) { Dispatcher.CurrentDispatcher.Invoke(new Action(() => { RefreshData(); […]

如何在匿名方法中产生回报?

基本上我有一个匿名方法,我用于我的BackgroundWorker : worker.DoWork += ( sender, e ) => { foreach ( var effect in GlobalGraph.Effects ) { // Returns EffectResult yield return image.Apply (effect); } }; 当我这样做时,编译器告诉我: “yield语句不能在匿名方法或lambda表达式中使用” 那么在这种情况下,最优雅的方法是什么? 顺便说一句,这个DoWork方法在静态方法中,以防对解决方案很重要。

将方法传递给backgroundworker dowork

在下面的代码中,有没有办法代替总是订阅updateWorker_DoWork方法,传递一个像这样的方法 public void GetUpdates(SomeObject blah) { //… updateWorker.DoWork += new DoWorkEventHandler(blah); //… } public void GetUpdates() { //Set up worker updateWorker.WorkerReportsProgress = true; updateWorker.WorkerSupportsCancellation = true; updateWorker.DoWork += new DoWorkEventHandler(updateWorker_DoWork); updateWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateWorker_RunWorkerCompleted); updateWorker.ProgressChanged += new ProgressChangedEventHandler(updateWorker_ProgressChanged); //Run worker _canCancelWorker = true; updateWorker.RunWorkerAsync(); //Initial Progress zero percent event _thes.UpdateProgress(0); }