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) 有任何想法吗?

整个ToolTip的Backgroundcolor

有谁知道一个简单的XAML解决方案来改变ToolTip的整个背景? 我做了以下事情: 但结果看起来像这样: 有什么建议?

C#/ VB.Net任务vs线程与BackgroundWorker

我有“谷歌搜索”但仍然与任务,线程和后台工作者混淆….. “任务是在当前线程上运行的高级API”是否正确? 如果1是正确的,为什么我需要使用invoke来更改同一线程中任务内的UI? Backgroundworker在应用程序中只有最低优先级? 那么backgroundworker的性能低于任务和线程? 对 ? 最后,在我的应用程序中,我需要使用“HttpWebRequest”从服务器获取一个字符串,之后解析字符串并更新UI。 如果我使用“HttpWebRequest.BeginGetResponse”等待异步结果并触发完整事件来更新UI,我需要使用invoke方法来调用UI线程控件,但是我可以使用后台工作器而不是吗? 我可以简单地在“RunWorkerCompleted”事件中更改UI,有什么不利之处吗? 对不起我的游泳池英语并感谢您的帮助……!

在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应用程序