2014-01-22 65 views
0
class Program 
{ 
    public delegate void ss(string s); 

    public static void print(string s) 
    { 
     Console.WriteLine("asynchronous thread..."+s+DateTime.Now.ToLongTimeString()); 
     System.Threading.Thread.Sleep(3000); 
    } 

    static void Main(string[] args) 
    { 
     ss s = print; 

     Console.WriteLine("Main thread..." + DateTime.Now.ToLongTimeString()); 

     IAsyncResult result = s.BeginInvoke("hello", null, null); 

     for (int i = 0; i < 50; i++) 
     { 
      Console.WriteLine("Main...thread..."+DateTime.Now.ToLongTimeString()); 
     } 

     System.Threading.Thread.Sleep(3000); 

     Console.WriteLine("Main...thread...after sleep" + DateTime.Now.ToLongTimeString()); 
     Console.WriteLine("Main...thread...after sleep..." + DateTime.Now.ToLongTimeString()); 

     s.EndInvoke(result); 

输出是:混淆异步编程

Main thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
**asynchronous thread...hello 4:20:01 PM** 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
Main...thread...4:20:01 PM 
**Main...thread...after sleep4:20:04 PM** 
**Main...thread...after sleep...4:20:04 PM** 

我的问题是,为什么睡眠方法不会在异步方法算什么?

+0

究竟你你的问题的意思...尝试在异步方法你的睡眠之后添加的输出,这可能使事情更清楚?你......(睡眠不是跨越所有线程,只是执行包含睡眠的代码的线程)。 – Jens

+0

哦!感谢延斯,这两个是在不同的线程...一个更多的问题,如果我不使用endInvoke()它会得到一些潜在的问题? –

+0

@Darkterror_jl委托调用的结果将被缓存,直到您调用EndInvoke。所以,最好把它叫做快速释放资源(btw文档说你应该总是叫它) –

回答

1

我的问题是为什么睡眠方法不计入异步方法?

确实遇到过。在写入行asynchronous thread...hello 4:20:01 PM之后,后台线程进入休眠状态,但主线程继续打印消息。添加消息后,后台线程已经觉醒,看到睡眠工作:

public static void print(string s) 
{ 
    Console.WriteLine("async thread..." + s + DateTime.Now.ToString("T")); 
    System.Threading.Thread.Sleep(2000); 
    Console.WriteLine("async thread after sleep " + DateTime.Now.ToString("T")); 
} 
+0

谢谢,这是正确的,我已经添加了'Thread.CurrentThread.ManagedThreadId'并看到这是不同的线程。 –

+0

@Darkterror_jl是的,你的后台线程正在睡觉,而主线程继续执行 –