标签: backgroundworker

使用BackgroundWorker处理程序中的参数

为了将数据传递到BackgroundWorkerDoWork我使用一个单独的包装类"实例:

MyParams mpar = new MyParams();
...
mpar.Par1 = par1val;
mpar.Par2 = par2val;
mpar.Par3 = par3val;
...
var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += new DoWorkEventHandler(worker1_DoWork);
worker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker1_RunWorkerCompleted);
worker1.RunWorkerAsync(mpar);
Run Code Online (Sandbox Code Playgroud)

然后我可以使用mpar实例的参数worker1_DoWork,在另一个线程中操作.

void worker1_DoWork(object sender, DoWorkEventArgs e)
 {
      //here we use mpar.Par1, mpar.Par2 and so on
 }
Run Code Online (Sandbox Code Playgroud)

RunWorkerCompletedEventHandler我们做的UI线程一些postactions.

我的问题是:我们可以在RunWorkerCompleted处理程序中使用它在处理程序mpar之前工作的实例,DoWork我们可以确定它的值与它的相同DoWork吗?如果不是,那么为各个BackgroundWorker操作阶段共享参数的正确方法是什么?

void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)(() =>
        {
            //Can …
Run Code Online (Sandbox Code Playgroud)

c# parameters multithreading backgroundworker

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

如何测试使用BackgroundWorker加载的ViewModel?

MVVM的一个好处是ViewModel的可测试性.在我的特定情况下,我有一个VM,它在调用命令时加载一些数据,以及相应的测试:

public class MyViewModel
{
    public DelegateCommand LoadDataCommand { get; set; }

    private List<Data> myData;
    public List<Data> MyData
    {
        get { return myData; }
        set { myData = value; RaisePropertyChanged(() => MyData); }
    }

    public MyViewModel()
    {
        LoadDataCommand = new DelegateCommand(OnLoadData);
    }

    private void OnLoadData()
    {
        // loads data over wcf or db or whatever. doesn't matter from where...
        MyData = wcfClient.LoadData();
    }
}

[TestMethod]
public void LoadDataTest()
{
    var vm = new MyViewModel();
    vm.LoadDataCommand.Execute();
    Assert.IsNotNull(vm.MyData);
}
Run Code Online (Sandbox Code Playgroud)

所以这一切都很简单.但是,我真正想做的是使用a加载数据BackgroundWorker,并在屏幕上显示"加载"消息.所以我将VM更改为: …

c# wpf unit-testing mvvm backgroundworker

13
推荐指数
1
解决办法
2612
查看次数

在控制台应用程序中使用.NET BackgroundWorker类

我对.NET编程和多线程一般都比较陌生,并且想知道是否可以使用.NET提供的BackgroundWorker来产生工作线程来在控制台应用程序中做一些工作?从在线的各种文档中,我看到这个类的意图更多的是面向UI的应用程序,你想在后台做一些工作,但保持UI响应,报告进度,取消处理,如果需要等.

在我的情况下,基本上我有一个控制器类,我想在多个工作线程中产生一些处理(限制使用信号量产生的最大工作线程数).然后我希望我的控制器类阻塞,直到所有线程都完成处理.所以在我启动一个工作线程做一些工作后,我希望线程能够在处理完成时通知控制器线程.我看到我可以使用后台工作者类,并处理事件DoWork和RunWorkerCompleted来实现这一点,但是想知道这是不是一个好主意?有没有更好的方法来实现这一目标?

.net multithreading backgroundworker

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

如何将类内的进度报告给BackgroundWorker?

我的WinForm调用一个执行一些复制操作的类.我想在表格上展示这方面的进展.

我想使用Backgroundworker,但我不知道如何报告从课程到表单的进度(/ backgroundworker)

c# backgroundworker

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

如何判断一个编写器是否已关闭?

我正在使用一个streamwriter与后台工作者一起进行日志记录.

就这样,我有

System::Void
MyUI::execBWorker_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {

String^ outputPath = _clr::Settings::ApplicationLogPath("_log.txt", true, false);
logfile_ = gcnew StreamWriter(outputPath,true);

DoStuff();
logfile_->Close();
}
Run Code Online (Sandbox Code Playgroud)

DoStuff()方法中的内容引发了Progress事件.

System::Void
MyUI::execBWorker_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
logfile_->WriteLine("something");
}
Run Code Online (Sandbox Code Playgroud)

我觉得这真的很有气味.我怎样才能让它变得更好,或者至少如何检查日志文件是否尚未关闭?有很多消息,所以我担心连续打开和关闭日志文件.

.net clr c++-cli backgroundworker streamwriter

12
推荐指数
1
解决办法
8766
查看次数

关闭应用程序会停止所有活动的BackgroundWorkers吗?

简单的问题,重复标题:

关闭WinForms应用程序是否会停止所有活动的BackgroundWorkers?

c# backgroundworker winforms

11
推荐指数
3
解决办法
2609
查看次数

取消后台任务

当我的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
查看次数

执行SQL查询时显示进度条

我想在从SQL数据库中读取数据时通知用户,我决定使用进度条创建一个表单,但它不起作用 - 可能是因为需要一个线程.我想以编程方式创建表单

        ProgressBar pb = new ProgressBar();

        pb.MarqueeAnimationSpeed = 30;
        pb.Style = ProgressBarStyle.Marquee;
        pb.Dock = DockStyle.Fill;

        progressForm.ClientSize = new Size(200, 50);
        progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
        progressForm.StartPosition = FormStartPosition.CenterScreen;
        progressForm.Controls.Add(pb);
        progressForm.ControlBox = false;
        progressForm.TopMost = true;

        progressForm.Show();  
        //do data processes here (all queries and executes)
        progressForm.close();
Run Code Online (Sandbox Code Playgroud)

如何修改上面的代码以实现我的既定目标?

编辑:顺便说一句,我想在我的项目中的每个数据函数中使用此进度条表单.例如:fillGrid,runQuery ..

@Will非常感谢你的回答.我的意思是我如何使用类的函数,例如我的gridFill函数在该连接类中:

 class ConnectionClass
    {
       public static SqlConnection connection = new SqlConnection();

    public string sorgu;
    public static string server;
    public static string userId;
    public static string catalog;
    public static string password;
    public static …
Run Code Online (Sandbox Code Playgroud)

c# sql multithreading backgroundworker progress-bar

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

简单的BackgroundWorker不会更新网页上的标签

我在这个有用的帖子中使用了一段简单的代码

它使用一个按钮和一个标签,标签应报告"10%完成"......"20%完成"......等等.

当我调试时,代码被点击,但我的标签没有在浏览器上更新.

我尝试使用和不使用更新面板,有和没有母版页.

protected void btnStartThread_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        // this allows our worker to report progress during work
        bw.WorkerReportsProgress = true;

        // what to do in the background thread
        bw.DoWork += new DoWorkEventHandler(delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            // do some simple processing for 10 seconds
            for (int i = 1; i <= 10; i++)
            {
                // report the progress in percent
                b.ReportProgress(i * 10); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net multithreading backgroundworker

11
推荐指数
1
解决办法
1527
查看次数

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

我目前有以下内容:

查看模型

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
查看次数