2014-01-22 62 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是的,你的後臺線程正在睡覺,而主線程繼續執行 –