我的代码如下
public CountryStandards()
{
InitializeComponent();
try
{
FillPageControls();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Country Standards", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
/// <summary>
/// Fills the page controls.
/// </summary>
private void FillPageControls()
{
popUpProgressBar.IsOpen = true;
lblProgress.Content = "Loading. Please wait...";
progress.IsIndeterminate = true;
worker = new BackgroundWorker();
worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(worker_ProgressChanged);
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
GetGridData(null, 0); // filling grid …Run Code Online (Sandbox Code Playgroud) 我是WPF的初学者,在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要7-8秒才能完成,在此期间我的UI变得无法响应.为了解决这个问题,我在一个单独的线程中执行初始化:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些文章BackgroundWorker,关于它应该如何允许我保持我的应用程序响应,而不必编写一个线程来执行冗长的任务,但我没有成功地尝试实现它,任何人都可以告诉我怎么做这个使用BackgroundWorker?
谢谢,Eamonn
我有一个关于我应该在Windows窗体应用程序上使用的后台线程实现的选择的风格问题.目前我BackgroundWorker在一个具有无限(while(true))循环的表单上.在这个循环中,我WaitHandle.WaitAny用来保持线程打盹直到感兴趣的事情发生.我等待的一个事件句柄是一个" StopThread"事件,这样我就可以摆脱循环.来自我被覆盖的事件会发出此事件的信号Form.Dispose().
我读到的某个地方BackgroundWorker真的是用于那些你不想将UI绑定到并且具有有限结束的操作 - 比如下载文件或处理一系列项目.在这种情况下,"结束"是未知的,并且仅在窗口关闭时.因此,使用后台线程而不是BackgroundWorker为此目的更合适吗?
在过去的几天里,我测试了.net 4.5和c#5的新功能.
我喜欢它的新async/await功能.之前我曾使用BackgroundWorker通过响应式UI在后台处理更长的进程.
我的问题是:在拥有这些不错的新功能之后,我何时应该使用async/await和什么时候使用BackgroundWorker?两者的常见情况是什么?
c# backgroundworker task-parallel-library async-await .net-4.5
假设我想将一个int参数发送给后台工作者,如何实现呢?
private void worker_DoWork(object sender, DoWorkEventArgs e) {
}
Run Code Online (Sandbox Code Playgroud)
我知道什么时候这是worker.RunWorkerAsync();,我不明白如何在worker_DoWork中定义它应该采用int参数.
考虑一个对象的假设方法,为您做一些事情:
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
Run Code Online (Sandbox Code Playgroud)
如何等待BackgroundWorker完成?
在过去,人们尝试过:
while (_worker.IsBusy)
{
Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
但是这种死锁,因为IsBusy在RunWorkerCompleted事件处理之后才会被清除,并且在应用程序空闲之前无法处理该事件.在工人完成之前,应用程序不会闲置.(另外,这是一个繁忙的循环 - 恶心.)
其他人已添加建议将其融入:
while (_worker.IsBusy)
{
Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是Application.DoEvents()导致当前队列中的消息被处理,这会导致重入问题(.NET不可重入).
我希望使用一些涉及事件同步对象的解决方案,其中代码等待事件 - 工作者的RunWorkerCompleted事件处理程序设置.就像是:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, …Run Code Online (Sandbox Code Playgroud) 任务并行库是否有任何可以被认为是对BackgroundWorker类的替换或改进?
我有一个带有向导式UI的WinForms应用程序,它执行一些长时间运行的任务.我希望能够使用标准进度条和取消操作的响应式UI.我之前用BackgroundWorker做过这个,但是我想知道是否有一些可以使用的TPL模式?
我的WinForms应用程序使用许多BackgroundWorker对象从数据库中检索信息.我正在使用BackgroundWorker,因为它允许UI在长时间运行的数据库查询期间保持解除阻塞状态,并简化了我的线程模型.
我在其中一些后台线程中偶尔会遇到DatabaseExceptions,并且在调试时我在工作线程中至少目睹了其中一个异常.我相当有信心这些例外是超时,我认为它不时是合理的.
我的问题是当在其中一个后台工作线程中发生未处理的异常时会发生什么.
我不认为我可以在另一个线程中捕获异常,但我可以期望我的WorkerCompleted方法被执行吗?我是否可以查询异常的BackgroundWorker的任何属性或方法?
我有一个小型的WinForms应用程序,它利用BackgroundWorker对象来执行长时间运行的操作.
后台操作会抛出偶然的异常,通常是当有人打开正在重新创建的文件时.
无论代码是否从IDE运行,.NET都会弹出一个错误对话框,通知用户发生了未处理的异常.使用Release配置编译代码也不会改变它.
根据MSDN:
如果操作引发了代码无法处理的异常,则BackgroundWorker会捕获异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,它作为System.ComponentModel .. ::.RunWorkerCompletedEventArgs的Error属性公开.如果您在Visual Studio调试器下运行,则调试器将在DoWork事件处理程序中引发未处理的异常的位置中断.
我希望有时抛出这些异常,并希望在RunWorkerCompleted事件而不是DoWork中处理它们.我的代码正常工作,并且在RunWorkerCompleted事件中正确处理错误,但我不能在我的生活中弄清楚如何停止.NET错误对话框抱怨发生"未处理的异常".
是不是BackgroundWorker应该自动捕获该错误?这不是MSDN文档中的内容吗?什么我需要做的通知.NET,这个错误是被处理,同时仍允许例外propage到RunWorkerCompletedEventArgs的错误属性?
我有一个生成BackgroundWorker的表单,它应该更新表单自己的文本框(在主线程上),因此Invoke((Action) (...));调用.
如果HandleClosingEvent我只是做bgWorker.CancelAsync()然后我得到ObjectDisposedException的Invoke(...)电话,可以理解.但是,如果我坐在那里HandleClosingEvent等待bgWorker完成,那么.Invoke(...)永远不会返回,也是可以理解的.
任何想法如何关闭此应用程序而不会出现异常或死锁?
以下是简单Form1类的3个相关方法:
public Form1() {
InitializeComponent();
Closing += HandleClosingEvent;
this.bgWorker.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
while (!this.bgWorker.CancellationPending) {
Invoke((Action) (() => { this.textBox1.Text = Environment.TickCount.ToString(); }));
}
}
private void HandleClosingEvent(object sender, CancelEventArgs e) {
this.bgWorker.CancelAsync();
/////// while (this.bgWorker.CancellationPending) {} // deadlock
}
Run Code Online (Sandbox Code Playgroud) backgroundworker ×10
c# ×9
.net ×3
winforms ×3
wpf ×2
.net-4.5 ×1
async-await ×1
debugging ×1
exception ×1