MyException - 我的异常网
当前位置:我的异常网» C# » 异步调用System.IO.FileStream的BeginRead的返回值I

异步调用System.IO.FileStream的BeginRead的返回值IAsyncResult的IsCompleted属性的有关问题(3)

www.MyException.Cn  网友分享于:2013-02-21  浏览:105次

                    Console.WriteLine(message);
                    Console.WriteLine();
                },
                null);

            Console.WriteLine("第一步操作已经完成。现在主程序继续进行!");
            Console.WriteLine("线程的 Id: {0}", Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine();

            // 等待第二个线程完成
            while (!result.IsCompleted)
            {
                Thread.Sleep(10);
            }

            Console.WriteLine("注意,此时第三步操作已经完成,回车后结束程序。");
            Console.WriteLine();

            Console.ReadLine();
        }


    }
}

APM

------解决方案--------------------
你在异步回调中Thread.Sleep(6000);是毫无意义的,那个result.IsCompleted指示了异步操作的完成,并不是异步回调的完成,当异步操作完成后,就会更改IsCompleted的属性值为true,并执行异步回调函数。
既然你用到了异步回调函数,根本不需要在主线程中轮询异步状态,直接把后续操作写在异步回调中即可。
------解决方案--------------------
引用:
我最近找到了这样的一段代码,他想演示如何解决异步操作的线程同步问题。
 具体操作是这样的:主线程异步调用后不断地轮询判断异步调用返回的IAsyncResult的IsCompleted(标示是否异步调用完成)属性,如果IsCompleted为真就不再轮询,进行后续的操作。

这种垃圾代码一定要尽一切可能去避免。

主线程异步调用某个操作,它只要把回调方法作为参数注册给调用操作,然后就结束了。

主线程一旦阻塞在那里去轮询你的标志,主线程还能干正经事吗?此时你的程序就看起来“卡死了”。

因此异步调用操作,就不应该出现什么“循环”代码。这种垃圾代码一定要尽可能去避免。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有