莆仙生活网
当前位置: 莆仙生活网 > 知识库 >

backgroundworker

时间:2024-03-28 02:14:07 编辑:莆仙君

c# backgroundWorker的用法:

(s, e) =>{}; 是一个匿名委托匿名委托——为事件(event)注册匿名委托 - 草青工作室 的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/xxj_jing/article/details/7332702下面的用法也是可以的。bgw.DoWork +=bgw_DoWork;//放到相应过程中bgw_DoWork(object e,,DoWorkEventArgs e){}BackgroundWorker 类 (System.ComponentModel)https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx

Runable和thread的区别

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口; Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的 run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子:   package org.thread.demo;   class MyThread extends Thread{   private String name;   public MyThread(String name) {   super();   this.name = name;   }   public void run(){   for(int i=0;i<10;i++){   System.out.println("线程开始:"+this.name+",i="+i);   }   }   }   package org.thread.demo;   public class ThreadDemo01 {   public static void main(String[] args) {   MyThread mt1=new MyThread("线程a");   MyThread mt2=new MyThread("线程b"); // thread1,thread2,按顺序进行   mt1.run();   mt2.run();   }   }   但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动   start()方法启动线程:   package org.thread.demo;   public class ThreadDemo01 {   public static void main(String[] args) {   MyThread mt1=new MyThread("线程a");   MyThread mt2=new MyThread("线程b");   //乱序进行 mt1.start();   mt2.start();   }   }; 这样程序可以正常完成交互式运行。那么为啥非要使用start()方法启动多线程呢?   在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)   ·Runnable接口   在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。   public interface Runnable{   public void run();   }   例子:   package org.runnable.demo;   class MyThread implements Runnable{   private String name;   public MyThread(String name) {   this.name = name;   }   public void run(){   for(int i=0;i<100;i++){   System.out.println("线程开始:"+this.name+",i="+i);   }   }   }; 但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable target)   此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多   线程。(start()可以协调系统的资源):   package org.runnable.demo;   import org.runnable.demo.MyThread;   public class ThreadDemo01 {   public static void main(String[] args) {   MyThread mt1=new MyThread("线程a");   MyThread mt2=new MyThread("线程b");   new Thread(mt1).start();   new Thread(mt2).start();   }   }


如何使用backgroundworker实现登陆等待效果

/*在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般
会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷
新界面上的进度条等显示元,必要进,还要控制后台线程中断当前操作。

以前,类似的应用会比较麻烦,需要写的代码较多,也很容易出现异常。在 .net中,提供了一个
组件 backgroundworker就是专门解决这个问题的。

使用这个组件其实非常简单,例如,我们做一个类似如下界面的进度条的小例子,在后台线程中进行
耗时运算,同时刷新界面上的滚动条和提示信息,运行结束后,弹出处理结果。



在界面上拖入backgroundWorker组件,并响应其三个事件。

代码如下:*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 多线程小例子
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//这里就是通过响应消息,来处理界面的显示工作

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.label1.Text = e.UserState.ToString();
this.label1.Update();
}

//这里是后台工作完成后的消息处理,可以在这里进行后续的处理工作。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("运算终于完成了");
}

//这里,就是后台进程开始工作时,调用工作函数的地方。你可以把你现有的处理函数写在这儿。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
work(this.backgroundWorker1);
}

//真正的处理工作

private bool work(BackgroundWorker bk)
{
int tatle =10000;

for (int i = 0; i < tatle; i++)
{
if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
{
bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
return false;
}

//处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。
bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
}
return true;
}

private void button2_Click(object sender, EventArgs e)
{

//用户要求取消时,就这样处理一下。有时不太灵喔。

this.backgroundWorker1.CancelAsync();
}

private void button1_Click(object sender, EventArgs e)
{

//这一句,就是让后台工作开始。

this.backgroundWorker1.RunWorkerAsync();
}

private void button3_Click(object sender, EventArgs e)
{
this.Close();
}
}
}




//一般的工作,就这样的套路处理一下,基本就可以工作了,如果多个线程之间还要交互,或是有共享数据
//等问题,.net C# 中还是提供 System.Threading.Thread 类,跟传统用法没什么大区别,也挺好用的。


怎么根据条件停止BackgroundWorker线程,再根据条件再打开线程

怎么根据条件停止BackgroundWorker线程,再根据条件再打开线程
包管理器还原自动下载与通配符相匹配的“最新版本”。版本号的空引号对表示“使用最新可用项”。我们创建的项目可以针对一个或者多个
Framework(比如我们希望创建的可以同时在.NET Framework和.NET
Core上运行),支持的Framework定义在frameworks节点下。如果添加了多个Framework,并不是说最终生成的应用可以同时在这

些Framework中运行,而是说源文件在编译的时候会针对这些Framework生成对应的程序集。对于传统的.NET项目来说,如果我们需要调用某
个API,需要添加所在程序集的引用。对于.NET
Core来说,所有使用到的程序集都被打包成一个NuGet包,所以针对程序集的直接依赖转变成针对某个NuGet包的依赖。针对NuGet的依赖主要有
两种类型,一种是针对所有Framework的,它们会直接定义在dependencies节点下,另一种则是针对某个具体Framework的,
定义为当前Framework节点下的dependencies子节点。对于独立应用,运行时部分指定将支持的
OS,因此可指定要绑定到应用程序的运行时库。


winform中怎样在后台控制控件的位置

/// /// 根据图元参数和图参数生成界面控件 /// /// private void BuildControl(Label label) { Point point; if (label != null) { point = new Point(groupBox1.Location.X + 5, label.Location.Y + 25); } else { point = new Point(groupBox1.Location.X + 5, groupBox1.Location.Y + 5); } label = new Label(); label.Text = “This is a label”; label.Margin = new Padding(10, 6, 0, 0); label.AutoSize = true; label.TextAlign = ContentAlignment.MiddleRight; label.Location = point ; TextBox txt = new TextBox(); txt.Name = "txt"; txt.Text = "This is a TextBox."; txt.Width = 100; txt.Location = point ; } }


wpf怎么取消把backgroundWorker的后台线程

终止BackgroundWorker,其实就是取消正在运行的后台操作。为此,执行以下步骤:

1)首先要把BackgroundWorker.WorkerSupportsCancellation属性的值设置为true
2)接着调用CancelAsync()方法
3)检查BackgroundWorker.CancellationPending 属性,判断后台异步操作是否被真正取消。
======
终止后台操作之所以这么繁琐,是因为后台操作是以异步方式运行在后台线程上的。


C#如何在BackgroundWorker 后台线程中使用定时器?

实际上,Timer并不只有你说的System.Windows.Forms.Timer一种。这个东西作为一个主线程(即UI线程)的控件,它的执行都会在UI线程,当然会造成线程阻塞,也就是你说的窗体未响应。
你可以尝试使用System.Threading.Timer,它可以实现控件Timer的一切功能。另外,和你说的System.Widnows.Forms.Timer不一样的是,它可以定义在非主线程中,当然它的定时执行方法也就不会影响到主线程了。
使用方法如下。
System.Threading.Timer timer = new System.Threading.Timer();//初始化
timer.Interval = 1000; //定时间隔1000ms
timer.Elapsed+=new EventHandler(timer_Elapsed);

private void timer_Elapsed()
{
//这里的代码每隔1秒时间就会运行,写你定时执行的事件即可
//并且,每次代码执行到这里,其实.NET内部都是用新的线程来处理这部分代码的
}

你将上面的东西封装成一个方法,注册到BackgroundWorker中,UI就不会假死的。

实际上,要在UI上定时调用异步,并且解决UI的假死,还有其他的方法,BackgroundWorker并不是唯一的选择。


c#窗体 如何在backgroundworker的DoWork中结束这个后台?

  你好,BackgroundWorker的DoWork事件的委托签名如下:  private void DoWork(object sender, DoWorkeventArgs e)  其中参数e包含了大量信息,同时能够接收使用e.Cancel=true令worker取消任务。  需要在DoWork中取消,应使用e.Cancel=true;return;  需要在外部取消,应:在初始化时令backgroundWorker1.WorkerReportsProgress = true;在外部控制的地方(如按钮事件)backgroundWorker1.CancelAsync();CancelAsync会更改worker的CancellationPending标志,所以在DoWork中应有类似下面的片段判断并退出。 if(backgroundWorker1.CancellationPending) { e.Cancel=true; return;}  最后,在DoWork退出后,如需在外部得知是何种原因导致结束(取消或完成),请在worker的RunWorkerCompleted事件中检查参数e.Cancel属性。