我已经跟踪了此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
答案 0 :(得分:1)
问题是控制台应用程序通常会在Main()
方法返回后立即停止。没有任何东西可以让它等待在后台线程上执行的代码。
最简单的解决方案(但对于生产应用程序无法使用的解决方案)是在Console.ReadLine()
的末尾添加Main()
。这样,Main()
在您按 Enter 之前不会返回,因此您可以确保应用程序不会过早退出。