标签: backgroundworker

取消后台任务

当我的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)

我还应该做些什么吗?

c# backgroundworker winforms

11
推荐指数
2
解决办法
4346
查看次数

使用进度条时"操作已完成"错误

我目前有以下内容:

查看模型

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 …

c# wpf backgroundworker progress-bar

11
推荐指数
2
解决办法
7244
查看次数

C#backgroundWorker报告字符串?

如何从backgroundWorker报告字符串(如"正在搜索文件...","找到选择...")回到我的windows.form以及百分比.另外,我有一个包含我想在backgroundWorker_Work中运行的方法的大类.我可以通过Class_method()调用它; 但是我无法通过backgroundWorker_Work方法报告我完成的百分比或来自被调用类的任何内容.

谢谢!

c# reporting progress backgroundworker visual-studio-2008

10
推荐指数
3
解决办法
1万
查看次数

如何在后台线程中创建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();
      }
Run Code Online (Sandbox Code Playgroud)

如何在后台线程中创建对象?

我使用WPF应用程序

c# wpf multithreading backgroundworker

10
推荐指数
1
解决办法
6675
查看次数

您是否可以链接到使用BackgroundWorker的一个很好的示例,而无需将其作为组件放在表单上?

我记得多年前(2005年)我在我的代码中使用BackgroundWorker而没有使用可视化组件,但我不记得是什么(不幸的是我很忘记并在我停止使用后很快忘记了所有内容) .也许我正在扩展BackgroundWorker类.你能链接到这种方式使用BackgroundWorker的好例子吗?

.net c# multithreading backgroundworker

10
推荐指数
1
解决办法
3万
查看次数

如何在C#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#的新手,有人可以举个例子.

c# events backgroundworker

10
推荐指数
3
解决办法
2万
查看次数

BackgroundWorker异常处理

我正在使用以下组件:

  • 图书馆(抛出异常)
  • 测试我的日志记录的测试控制台
  • 企业库异常处理应用程序块
  • 企业库日志记录应用程序块

我正在使用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

10
推荐指数
1
解决办法
2万
查看次数

从事件处理程序在主线程中执行一个方法

我有一个从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)

c# events multithreading backgroundworker winforms

10
推荐指数
1
解决办法
4万
查看次数

在BackGroundWorker中运行方法并显示ProgressBar

我想要的是当一些方法正在做一些任务时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)

c# multithreading backgroundworker winforms progress-bar

10
推荐指数
1
解决办法
6万
查看次数

C# - 后台工作者的CancelAsync()不起作用?

我想中止该过程但不能这样做,我正在使用后台工作程序和我的处理功能.

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()正在执行处理部分并返回结果.

请给我任何解决方案. …

c# backgroundworker

10
推荐指数
1
解决办法
2万
查看次数