Tag: 工作者

WPF中的multithreading使用C#(与后台工作者)

我编写了代码来保存应用程序生成的图像。 图像的大小约为32-35 MB。 将图像保存为BMB文件时,需要很长时间,大约3-5秒。 为此,我使用了后台工作程序但是在运行后台工作程序时,它显示了一个错误,例如……“无法访问在不同线程上创建的对象”。 以下是代码: private void btnSaveDesign_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog(); sfd.Title = “Save design as…”; sfd.Filter = “BMP|*.bmp”; if (sfd.ShowDialog() == true) { ww = new winWait(); ww.Show(); System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker(); bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); fName = sfd.FileName; cache = new […]

在不阻塞主线程的情况下执行长时间运行的UI更改

无论如何在没有影响C#winforms应用程序中的主线程的情况下运行大量UI更新? 当用户点击某个特定事件时,我希望避免长时间的延迟(在我的情况下,这是一个非常接近forms的处理内存的调用) 我知道我可以使用BackgroundWorker在“do work”事件中执行冗长的操作,但问题是你不能在这个事件中更改任何UI(它会导致交叉线程exception) – 所以我不能把我的大量关闭在这里打电话。 而且我不能将关闭forms调用放在“工作完成”事件中,因为这是在主线程上运行的,并且最终将锁定主线程导致糟糕的用户体验。 我已经考虑过只在应用程序会话空闲时才产生一个处理关闭的线程,但不确定这是否会有点混乱。

BackgroundWorker.RunWorkerCompleted和threading

AFAIK,承诺在创建者线程( BackgroundWorker RunWorkerCompleted Event )中调用此事件; 在大多数情况下,它按照承诺行事。 但是,有时RunWorkerCompleted 不会在创建BackgroundWorker对象的线程中调用。 更新:代码是这样的: Trace.WriteLine(Thread.CurrentThread.ManagedThreadId); var worker = new BackgroundWorker(); worker.DoWork += (s, args) => Trace.WriteLine(Thread.CurrentThread.ManagedThreadId); worker.RunWorkerCompleted += (s, args) => Trace.WriteLine(Thread.CurrentThread.ManagedThreadId); worker.RunWorkerAsync(); 输出为1 7 7(正确输出必须为1 7 1) 有任何想法吗?

在MVVM中,如何防止BackgroundWorker冻结UI?

首先,我在SO和网络上看到过很多类似的问题。 这些似乎都没有解决我的特定问题。 我有一个简单的BackgroundWorker其工作是逐行读取文件并报告进度以指示它有多远。 文件中总共有65,553行,因此对我来说, BackgroundWorker尽可能快地完成是很重要的。 由于MVVM建立在关注点分离(SoC)和View和View模型的分离之上,因此BackgroundWorker更新View绑定到的View-Model上的属性。 我的设置与Kent Boorgaart在另一个问题上的答案非常相似。 在高压力情况下, BackgroundWorker需要大量CPU而不会hibernate,UI线程缺乏并且无法更新已通过INotifyPropertyChanged通知的任何绑定属性。 但是,如果BackgroundWorkerhibernate,则作业将无法尽快完成。 如何在尊重MVVM的同时确保View接收进度更新,同时不限制作业? 在View-Model中, BackgroundWorker设置如下。 Start()函数由RelayCommand ( MVVM-Light的一部分Start()调用。 public void Start(string memoryFile) { this.memoryFile = memoryFile; BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += Worker_DoWork; worker.ProgressChanged += Worker_ProgressChanged; worker.WorkerReportsProgress = true; worker.RunWorkerAsync(); } 以下是实际工作的代码: private void Worker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = (BackgroundWorker)sender; IsAnalyzing = […]

在C#中实现进度条的正确方法

我正在学习winforms,我为自己设定了一个简单的目标,即制作一个从空到满的进度条。 这是我的畸形尝试: public partial class Form1 : Form { static BackgroundWorker bw = new BackgroundWorker(); public Form1() { InitializeComponent(); bw.DoWork += bw_DoWork; bw.RunWorkerAsync(); } void bw_DoWork(object sender, DoWorkEventArgs e) { for(int i=0; i<100; ++i) { progressBar1.PerformStep(); Thread.Sleep(10); } } } 我很确定Thread.Sleep()是应该受到谴责的。 我怎么在这里避免它?

C#取消背景工作者的DoWork

C#2008 我使用下面的代码登录软电话。 然而,登录进程是一个漫长的过程,因为有许多事情需要初始化和检查,我只在这里放了几个,因为它会使代码很长。 在下面的代码中,我在检查之前检查CancellatePending是否在我的取消按钮单击事件中调用了CancelAsync。 它是否正确? 此外,如果检查失败,我也调用CancelAsync并将e.Cancel设置为true。 我想知道我在这里使用的方法是否是最好的方法。 非常感谢任何建议, private void bgwProcessLogin_DoWork(object sender, DoWorkEventArgs e) { /* * Perform at test to see if the background worker has been * cancelled by the user before attemping to continue to login. * * Cancel background worker on any failed attemp to login */ // Start with cancel […]

在BackgroundWorker运行时显示模态窗口,而不会出现STA / MTA问题

我正在研究WPF应用程序。 我有一个耗时的方法,我想通过BackgroundWorker运行异步。 当该方法运行时,我想显示一个模态“Please Wait …”对话框窗口,该窗口必须在BackgroundWorker完成时自动关闭。 我目前对BackgroundWorker或任何multithreading编程的经验很少。 下面的代码当前导致InvalidOperationException ,消息“调用线程必须是STA,因为许多UI组件需要这个”。 请告诉我如何实现我想要实现的目标,以及额外的布朗尼点,如果你能帮我理解出了什么问题。 非常感谢! 编辑只是澄清 – 想法是主线程启动BackgroundWorker ,然后显示modal dialog。 当工人完成时,它会关闭modal dialog。 当模式对话框关闭时,主线程继续。 public class ImageResizer { private BackgroundWorker worker; private MemoryStream ImageData { get; set; } // incoming data private public MemoryStream ResizedImageData { get; private set; } // resulting data private Dialogs.WorkInProgressDialog ProgressDialog; // Public interface, called by […]

如何在后台线程中创建WPF控件?

我有创建后台线程的方法来做一些动作。 在这个后台线程中我创建了对象。 但是在运行时创建时这个对象给了我一个例外: 调用线程必须是STA,因为许多UI组件都需要这个。 我知道我必须使用Dispatcher来反映UI的内容。 但在这种情况下,我只是创建一个对象,而不是用UI迭代。 这是我的代码: public void SomeMethod() { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(Background_Method); worker.RunWorkerAsync(); } void Background_Method(object sender, DoWorkEventArgs e) { TreeView tv = new TreeView(); } 如何在后台线程中创建对象? 我使用WPF应用程序

请帮助我使这段代码线程安全

我在使数据加载和过滤线程安全方面遇到了一些问题。 我的控件基类上的以下代码通过BackgroundWorker处理所有数据填充。 这往往会在“this.DataWorker.RunWorkerAsync()”上抛出错误,说明BackgroundWorker正忙。 /// /// Handles the population of the form data. /// /// Whether to pull data back from the WebService. public void Populate(bool reload) { if (!this.DataWorker.IsBusy) { // Disable the filter options IvdSession.Instance.FilterManager.SetEnabledState(this.GetType(), false); // Perform the population this.DataWorker.RunWorkerAsync(reload); } else if (!reload) { // If the data worker is busy and […]

在检查取消时发送背景工作人员睡觉

我有一个后台工作者,通过ReportProgress定期更新GUI。 更新定期发生,例如每5秒一次,或者可能是20秒。 为了在设定的时间执行更新,我将工作进程发送到hibernate状态一段时间,当它唤醒时,它会使用新信息更新GUI。 工作人员支持取消,在睡觉之外取消正确。 我希望能够在等待期间调用取消,但是将线程发送到睡眠状态会使这变得不可能。 我假设我将不得不调用一个循环并检查取消作为循环的一部分来模拟线程睡眠。 实现这一目标的最佳方法是什么,我的尝试完全取消了。 long counter = 0; long sleepfor = timelinespeed*1000; int timelinespeed = 10; while (counter != sleepfor) { Thread.Sleep(1); counter++; if (bkgwk.CancellationPending) { cancelled = true; e.Cancel = true; bkgwk.Dispose(); break; } }