当我的C#应用程序关闭时,它有时会陷入清理例程.具体来说,后台工作人员没有关闭.这基本上就是我试图关闭它的方式:
private void App_FormClosing(object sender,FormClosingEventArgs e){backgroundWorker1.CancelAsync(); 而(backgroundWorker1.IsBusy); //被困在这里 }
我应该采取不同的方式吗?我使用的是Microsoft Visual C#2008 Express Edition.谢谢.
附加信息:
后台工作人员似乎没有退出.这就是我所拥有的:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
// Do something.
}
}
Run Code Online (Sandbox Code Playgroud)
我还修改了清理代码:
private void App_FormClosing(object sender, FormClosingEventArgs e)
{
while (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
System.Threading.Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我还应该做些什么吗?
我目前有以下内容:
查看模型
MovieProcessor movieProcessor = new MovieProcessor(SelectedPath, this);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += movieProcessor.processMovie_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
progressBar.Show();
worker.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
worker_ProgressChanged
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
CurrentProgress = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)
在我的MovieProcessor班上,我有方法processMovie_DoWork.
public async void processMovie_DoWork(object sender, DoWorkEventArgs e)
{
for (int x = 0; x < totalFilesToProcess; ++x)
{
// Do stuff like calling API
(sender as BackgroundWorker).ReportProgress(x);
}
}
Run Code Online (Sandbox Code Playgroud)
在第二次 ReportProgress(x)被调用时,我得到的错误:
This operation has already had OperationCompleted called …
如何从backgroundWorker报告字符串(如"正在搜索文件...","找到选择...")回到我的windows.form以及百分比.另外,我有一个包含我想在backgroundWorker_Work中运行的方法的大类.我可以通过Class_method()调用它; 但是我无法通过backgroundWorker_Work方法报告我完成的百分比或来自被调用类的任何内容.
谢谢!
我有创建后台线程的方法来做一些动作.在这个后台线程中我创建了对象.但是在运行时创建时这个对象给了我一个例外:
调用线程必须是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();
}
Run Code Online (Sandbox Code Playgroud)
如何在后台线程中创建对象?
我使用WPF应用程序
我记得多年前(2005年)我在我的代码中使用BackgroundWorker而没有使用可视化组件,但我不记得是什么(不幸的是我很忘记并在我停止使用后很快忘记了所有内容) .也许我正在扩展BackgroundWorker类.你能链接到这种方式使用BackgroundWorker的好例子吗?
我理解如何将一个变量(progresspercentage)传递给"progresschanged"函数,就像这样.
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
Run Code Online (Sandbox Code Playgroud)
...
worker.ReportProgress(pc);
Run Code Online (Sandbox Code Playgroud)
...
private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)
但我想将更多变量传递给这个函数,有些事情如下:
worker.ReportProgress(pc,username,score);
Run Code Online (Sandbox Code Playgroud)
...
private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.currentUser.Value = e.UserName; //as string
this.score.Value = e.UserScore; //as int
}
Run Code Online (Sandbox Code Playgroud)
抱歉,我是c#的新手,有人可以举个例子.
我正在使用以下组件:
我正在使用backgroundworker调用库方法.库会抛出异常,但永远不会调用RunWorkerCompleted处理程序.
捕获异常的唯一方法是使用try/catch块包围我的DoWork处理程序代码.
是否误解了RunWorkerCompletedEventArgs.Error属性?是不是因为获得了BackgroundWorker捕获的异常?
Codesample:
static BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(w_DoWork);
w.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(w_RunWorkerCompleted);
w.RunWorkerAsync();
static void w_DoWork(object sender, DoWorkEventArgs e)
{
MyClass m = new MyClass();
w.result = m.Compute();
}
static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
HandleException(e.Error);
}
/* result related code */
}
static void HandleException(Exception e)
{
ExceptionPolicy.HandleException(e, "MyPolicy");
}
Run Code Online (Sandbox Code Playgroud)
上面的示例导致我的控制台应用程序终止.vs2010输出绝对没有写入(只有默认输出).
那么问题出在哪里?
//编辑:此代码段用于捕获库的异常.
static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{ …Run Code Online (Sandbox Code Playgroud) c# multithreading enterprise-library exception backgroundworker
我有一个从Queue类继承的自定义Queue类.它有一个事件ItemAdded.在此事件的事件处理程序中,我正在执行一个方法.但它运行的不是主线程,虽然我想在主线程中.我不知道怎么做.有什么建议吗?
//My custom class
using System;
using System.Collections; //Required to inherit non-generic Queue class.
namespace QueueWithEvent
{
public class SmartQueue:Queue
{
public delegate void ItemAddedEventHandler(object sender, EventArgs e);
public event ItemAddedEventHandler ItemAdded;
protected virtual void OnItemAdded(EventArgs e)
{
if (ItemAdded != null)
{
ItemAdded(this, e);
}
}
public override void Enqueue(object Item)
{
base.Enqueue(Item);
OnItemAdded(EventArgs.Empty);
}
}
}
//Winform application
using System;
using System.ComponentModel;
using System.Windows.Forms;
using QueueWithEvent;
namespace TestApp
{
public partial class Form1 : Form
{
SmartQueue qTest …Run Code Online (Sandbox Code Playgroud) 我想要的是当一些方法正在做一些任务时UI保持活跃,我想在进度条中显示工作的进度.
我有一个方法,一个BackGroundWorker和一个Progressbar.我想在BackGroundWorker开始运行时调用该方法并显示进度.该方法包含一个循环.因此,它可以报告进度.
那么,可以做些什么呢?
private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed.
myBGWorker.WorkerReportsProgress = true;
}
private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
parseFiles();
}
private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
myProgressBar.Value = e.ProgressPercentage;
}
private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done");
}
private void parseButton_Click(object sender, EventArgs e)
{
myBGWorker.RunWorkerAsync();
}
public void …Run Code Online (Sandbox Code Playgroud) 我想中止该过程但不能这样做,我正在使用后台工作程序和我的处理功能.
public void Init()
{
bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
if (bw.CancellationPending == true)
{
e.Cancel = true;
}
else
{
e.Result = abd();
}
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{
lbltext.content="Canceled";
}
else
{
lbltext.content="Completed";
}
}
private void btncan_Click(object sender, RoutedEventArgs e)
{
bw.CancelAsync();
}
private void btnstart_Click(object sender, RoutedEventArgs e)
{
bw.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
我无法使用此代码中止该过程.功能abd()正在执行处理部分并返回结果.
请给我任何解决方案. …
backgroundworker ×10
c# ×10
winforms ×3
events ×2
progress-bar ×2
wpf ×2
.net ×1
exception ×1
progress ×1
reporting ×1