BackgroundWorker
BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题. BackgroundWorker
异步回调
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕 才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它 的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用 回调来实现异步消息的注册,通过异步调用来实现消息的通知。
BackgroundWorker和Thread的区别
当用户执行一个非常耗时的操作时,如果不借助Thread编程,用户就会感觉界面反映很迟钝。在.Net 2.0中可以通过BackgroundWork非常方便地进行Thread编程,大致的步骤是:
1、调用BackgroundWorker的RunWorkerAsync方法(可以传递参数),它将调用DoWork事件
2、在DoWork的事件响应代码中调用耗时的操作,此例中是PingIPs函数
3、在耗时操作中判断CancellationPending属性,如果为false则退出
4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递)
5、在ProgressChanged事件的响应代码中将改变呈现给用户
6、如果需要取消耗时操作,则调用BackgroundWorker的CancelAsync方法,需要和步骤3一起使用
C#异步回调:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace 多线程
{
class 异步回调
{
public delegate int TakesAwhileDel(int data, int ms);
static void Main(string[] args)
{
//异步委托
TakesAwhileDel dl = TakesAwhile;
dl.BeginInvoke(1, 3000, AsyncCallbackImpl, dl);
for (int i = 0; i < 100; i++)
{
Console.WriteLine(".");
Thread.Sleep(50);
}
Console.ReadLine();
}
public static void AsyncCallbackImpl(IAsyncResult ar)
{
TakesAwhileDel dl = ar.AsyncState as TakesAwhileDel;
int re = dl.EndInvoke(ar);
Console.WriteLine("结果{0}", re.ToString());
}
static int TakesAwhile(int data, int ms)
{
Console.WriteLine("开始调用");
Thread.Sleep(ms);
Console.WriteLine("完成调用");
return ++data;
}
}
}
本文介绍了C#中使用BackgroundWorker组件处理多线程任务,避免UI假死问题。同时,讨论了异步回调的概念,以及与Thread的区别,并提供了一个C#异步回调的示例代码。
3029

被折叠的 条评论
为什么被折叠?



