为什么异步调用不适用于回调模式?

时间:2014-06-14 23:27:45

标签: c# .net asynchronous

我已经跟踪了此Microsoft文档中异步调用模式的演示:http://support.microsoft.com/kb/315582

在示例5中,有一个示例代码演示了回调模式,但它不起作用。这是示例代码:

using System;
using System.Threading;
using System.Windows.Forms;

namespace Recipe.Ch04
{
    public class AsyncDemo
    {
        string LongRunningMethod (int iCallTime, out int iExecThread)
        {
            Thread.Sleep (iCallTime) ;
            iExecThread = AppDomain.GetCurrentThreadId ();
            return "MyCallTime was " + iCallTime.ToString() ;
        }

        delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;

        public void DemoCallback()
        {
            MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
            string s ;
            int iExecThread;

            // Create the callback delegate.
            AsyncCallback cb = new AsyncCallback(MyAsyncCallback);

            // Initiate the Asynchronous call passing in the callback delegate
            // and the delegate object used to initiate the call.
            IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, cb, dlgt); 
        }

        public void MyAsyncCallback(IAsyncResult ar)
        {
            string s ;
            int iExecThread ;

            // Because you passed your original delegate in the asyncState parameter
            // of the Begin call, you can get it back here to complete the call.
            MethodDelegate dlgt = (MethodDelegate) ar.AsyncState;

            // Complete the call.
            s = dlgt.EndInvoke (out iExecThread, ar) ;

            Console.WriteLine (string.Format ("The delegate call returned the string: \"{0}\", and the number {1}", s, iExecThread.ToString() ) );
        }

        static void Main(string[] args)
        {
            AsyncDemo ad = new AsyncDemo () ;
            ad.DemoCallback() ;
        }
    }
}

这个回调模式实现有什么问题?为什么它在控制台屏幕上编译但没有显示任何内容?

在线编译和执行:http://ideone.com/V8b2NY

1 个答案:

答案 0 :(得分:1)

问题是控制台应用程序通常会在Main()方法返回后立即停止。没有任何东西可以让它等待在后台线程上执行的代码。

最简单的解决方案(但对于生产应用程序无法使用的解决方案)是在Console.ReadLine()的末尾添加Main()。这样,Main()在您按 Enter 之前不会返回,因此您可以确保应用程序不会过早退出。