快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

永乐国际app 下载_机器人论坛网进入



在.Net中,假如我们在非UI线程上造访窗体上的控件的时刻,会孕育发生一个跨线程调用的非常,那么若何处置惩罚这种环境呢?在上一章中,我先容了应用Control.Invoke措施,假如你不习气应用委托,那么.Net还为我们供给了一个组件BackgroundWorker,你可以应用这个组件,以事故的要领去处置惩罚这种跨线程的控件造访。下面我就来具体的先容一下这个组件的用法。

我们先来看一下BackgroundWorker供给了哪些常用的成员,

事故

DoWork:我们在这个事故中,履行必要异步处置惩罚的事情。

ProgressChanged:我们在这个事故中,接管并处置惩罚异步处置惩罚历程中的信息。

RunWorkerCompleted:我们在这个事故中,履行异步处置惩罚停止的事情。

措施

RunWorkerAsync()和RunWorkerAsync(object argument):这两个措施触发DoWork事故,开始异步操作。

ReportProgress(int percentProgress)和ReportProgress(int percentProgress, object userState):这两个措施触发ProgressChanged事故。

CancelAsync:停止后台的异步操作。

属性

bool CancellationPending:唆使当前的后台的异步操作是否正在被取消,履行CancelAsync措施会导致这个属性为true。

bool IsBusy:唆使当前的后台异步操作是否正在进行,进行中为true。

bool WorkerReportsProgress:获取或设置当前的BackgroundWorker是否可以履行ProgressChanged措施。

bool WorkerSupportsCancellation:获取或设置当前的BackgroundWorker是否可以履行CancelAsync措施。

OK,有了上面这些成员,我们来看一下BackgroundWorker是若何事情的。

Step 1. 当然是定义一个BackgroundWorker的实例,你可以从对象箱中拖拽一个BackgroundWorker控件到窗体上或者在代码中直接声明;

Step 2. 天生DoWork事故并在DoWork事故的中添加必要异步履行的代码。在异步履行的代码中,假如必要处置惩罚界面中的控件,请调用ReportProgress措施,而不要直接处置惩罚(例如给控件赋值),由于DoWork事故跟正常的界面的事故不合,这个事故在非UI线程上履行,以是才能异步履行。

Step 3. 天生ProgressChanged事故并添加控件处置惩罚的代码,由于这个事故是在UI线程上履行的,以是可以给界面中的控件进行赋值等操作。

Step 4. 假如必要,请天生RunWorkerCompleted事故,在此处置惩罚异步履行停止的营业逻辑。当然,此事故也是在UI线程上履行的,可以给界面中的控件进行赋值等操作。

Step 5. 在必要履行异步操作的地方调用RunWorkerAsync措施,开始履行异步调用。

下面是详细的代码:

1: public Form1()

2: {

3:InitializeComponent();

4:bWorker.DoWork += new DoWorkEventHandler(bWorker_DoWork);

5:bWo永乐国际app 下载rker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bWorker_RunWorkerCompleted);

6:bWorker.ProgressChanged += new ProgressChangedEventHandler(bWorker_ProgressChanged);

7:this.Text = "UI thread id is:" + Thread.CurrentThread.ManagedThreadId.ToString();

8: }

9:

10: BackgroundWorker bWorker = new BackgroundWorker();

11:

12: void bWorker_DoWork(object sender, DoWorkEventArgs e)

13: {

14:int tick = (int)e.Argument;

15:Thread thr = Thread.CurrentThread;

16:for (int i = 0; i

17:永乐国际app 下载{

18:if (bWorker.CancellationPending)

19:{

20:e.Cancel = true;

21://break;

22:}

23:else

24:{

25:Thread.Sleep(TimeSpan.FromSeconds(tick));

26:bWorker.ReportProgress(i, DateTime.Now.ToString() + "\\TID:" + thr.ManagedThreadId.ToString());

27:}

28:}

29:

30: }

31:

32: void bWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

33: {

34:prog永乐国际app 下载ressBar1.Value = e.ProgressPercentage;

35:label1.Text = e.UserState.ToString();

36: }

37:

38: void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

39: {

40:label1.Text = DateTime.Now.ToString();永乐国际app 下载

41:progressBar1.Value = progre永乐国际app 下载ssBar1.Maximum;

42:if (e.Cancelled)

43:label1.Text = "User cancelled.";

44: }

45:

46: private void btnInvoke_Click(object sender, EventArgs e)

47: {

48:bWorker.WorkerReportsProgress = true;

49:bWorker.WorkerSupportsCancellation = true;

50:if (!bWorker.IsBusy)

51:bWorker.RunWorkerAsync(1);

52: }

53:

54: private void btnCancel_Click(object sender, EventArgs e)

55: {

56:if (bWorker.WorkerSupportsCancellation)

57:bWorker.CancelAsync();

58: }

您可能还会对下面的文章感兴趣: