原文地址: http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html

 

前些日子,看到园子里面有人用老王喝茶的例子讲解了一下同步和异步,虽然没有代码实现,但是能够通俗易懂的讲解了同步、异步、阻塞、非阻塞的关系了,今天借题发挥,用一个热水器加热洗澡的例子来具体演示一下C#使用委托进行异步编程。

首先引用MSDN中的一段话来描述一下如何使用异步方式
.NET Framework 允许您异步调用任何方法。 为此,应定义与您要调用的方法具有相同签名的委托;公共语言运行时会自动使用适当的签名为该委托定义 BeginInvoke 和 EndInvoke 方法。

BeginInvoke 方法启动异步调用。 该方法与您需要异步执行的方法具有相同的参数,还有另外两个可选参数。 第一个参数是一个 AsyncCallback 委托,该委托引用在异步调用完成时要调用的方法。 第二个参数是一个用户定义的对象,该对象将信息传递到回调方法。 BeginInvoke 立即返回,不等待异步调用完成。 BeginInvoke 返回一个 IAsyncResult,后者可用于监视异步调用的进度。

EndInvoke 方法检索异步调用的结果。 在调用 BeginInvoke 之后随时可以调用该方法。 如果异步调用尚未完成,则 EndInvoke 会一直阻止调用线程,直到异步调用完成。 EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数(在 Visual Basic 中为 <Out> ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。

上文中提到了一个 IAsyncResult 接口,这个就是今天的主角

也来说说C#异步委托(转)
public interface IAsyncResult
{
     object AsyncState { get; }

     WaitHandle AsyncWaitHandle { get; }

     bool CompletedSynchronously { get; }

     bool IsCompleted { get; }
}
也来说说C#异步委托(转)

 IAsyncResult 类型公开以下成员:

AsyncState :获取用户定义的对象,它限定或包含关于异步操作的信息
AsyncWaitHandle :获取用于等待异步操作完成的 WaitHandle
CompletedSynchronously :获取一个值,该值指示异步操作是否同步完成
IsCompleted :获取一个值,该值指示异步操作是否已完成

 如果上面的介绍看不明白,没有关系,下面来通过一个例子来进行演示,您一定会搞清晰明白的,先看一下程序主界面图,以便后面的代码说明较好理解。 

也来说说C#异步委托(转)

我们建立的是一个winform程序,我们先用同步的方式来演示一下老王想洗澡这件事,洗澡就得用热水器烧水,因此我们先定义一个热水器类 Heater,代码如下:

也来说说C#异步委托(转)
public class Heater
    {
        /// <summary>
        /// 设定的温度
        /// </summary>
        public int SetTemp { get; set; }

        /// <summary>
        /// 当前水温
        /// </summary>
        private int _currentTemp;
        public int CurrentTemp
        {
            get { return _currentTemp; }
        }

        private bool _flag;
        public bool Flag
        {
            get { return _flag; }
            
        }

        public Heater()
        {
            this._flag = false;
        }

        /// <summary>
        /// 烧水
        /// </summary>
        public int BoilWater()
        {
            Thread.Sleep(5000);
            for (int i = 0; i <= 100; i++)
            {
                //Thread.Sleep(50);
                _currentTemp = i;
                if (_currentTemp >= SetTemp)
                {
                    _flag = true;
                    break;
                }
            }
            return _currentTemp;
        }
    }
也来说说C#异步委托(转)

相关文章:

  • 2022-12-23
  • 2021-08-07
  • 2022-12-23
  • 2021-10-13
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-02-01
  • 2021-10-12
  • 2021-10-18
  • 2021-09-23
  • 2022-12-23
  • 2021-12-03
相关资源
相似解决方案