程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#異步調用的幾種方式

c#異步調用的幾種方式

編輯:C#入門知識

首先,我們分析一下異步處理的環境

需要在當前線程中獲取返回值
不需要在當前線程中獲取返回值,但是仍然需要對返回值做處理
對於第1中情況,還可以繼續細分

在當前線程中啟動線程T,然後繼續執行當前線程中的其它任務,最後在當前線程中獲取T的返回值
在當前線程中啟動線程T,然後繼續執行當前線程中的其它任務R1,等待T執行完成,當T執行完成後,繼續執行當前線程中的其它任務R2,最後獲取T的返回值
在當前線程中啟動線程T,只要T在執行就執行任務R,最後獲取T的返回值
下面,我將一一給出例子:

1.1 在當前線程中啟動線程T,然後繼續執行當前線程中的其它任務,最後在當前線程中獲取T的返回值
view sourceprint?01 using System; 

02 using System.Collections.Generic; 

03 using System.Linq; 

04 using System.Windows.Forms; 

05 using System.Threading; 

06 using System.Runtime.Remoting.Messaging; 

07 namespace FirstWF 

08 { 

09     static class Program 

10     { 

11         /// <summary> 

12         /// The main entry point for the application. 

13         /// </summary> 

14         [STAThread] 

15         static void Main() 

16         { 

17             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func); 

18             Console.WriteLine("Input number please..."); 

19             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null); 

20             Console.WriteLine("Implement other tasks"); 

21             Thread.Sleep(7000); 

22             Console.WriteLine("Implement other tasks end ..."); 

23             Console.WriteLine("Get users input"); 

24             Console.WriteLine(caller.EndInvoke(result)); 

25             Console.ReadLine(); 

26         } 

27         delegate string AsyncFuncDelegate(int userInput); 

28         static string Func(int userInput) 

29         { 

30             Console.WriteLine("Func start to run"); 

31             Console.WriteLine("..."); 

32             Thread.Sleep(5000); 

33             Console.WriteLine("Func end to run"); 

34             return userInput.ToString(); 

35         } 

36     } 

37 }

輸出結果如下:

Implement other tasks

Func start to run

...

Func end to run

Implement other tasks end ...

Get users input

56

1.2 在當前線程中啟動線程T,然後繼續執行當前線程中的其它任務R1,等待T執行完成,當T執行完成後,繼續執行當前線程中的其它任務R2,最後獲取T的返回值
view sourceprint?01 static void Main() 

02         { 

03             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func); 

04             Console.WriteLine("Input number please..."); 

05             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null); 

06             Console.WriteLine("Implement task 1"); 

07             result.AsyncWaitHandle.WaitOne(); 

08             result.AsyncWaitHandle.Close(); 

09             Console.WriteLine("Implment task 2"); 

10             Console.WriteLine("Get users input"); 

11             Console.WriteLine(caller.EndInvoke(result)); 

12             Console.ReadLine(); 

13         }

輸出結果如下:

Input number please...

25

Implement task 1

Func start to run

...

Func end to run

Implment task 2

Get users input

25

 

1.3 在當前線程中啟動線程T,只要T在執行就執行任務R,最後獲取T的返回值
view sourceprint?01 [STAThread] 

02         static void Main() 

03         { 

04             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func); 

05             Console.WriteLine("Input number please..."); 

06             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null); 

07             while (!result.IsCompleted) 

08             { 

09                 Thread.Sleep(1000); 

10                 Console.Write(">"); 

11             } 

12             Console.WriteLine(""); 

13             Console.WriteLine("Implement other task2"); 

14             Console.WriteLine("Get users input"); 

15             Console.WriteLine(caller.EndInvoke(result)); 

16             Console.ReadLine(

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved