zoukankan      html  css  js  c++  java
  • 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 user's 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 user's 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 user's 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 user's 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 user's input"); 

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

    16             Console.ReadLine(); 

    17         }

    输出结果如下:

    Func start to run

    ...

    >>>>>Func end to run

    >

    Implement other task2

    Get user's input

    23

    2 不需要在当前线程中获取返回值,但是仍然需要对返回值做处理
     

    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             caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), new AsyncCallback(CallBackFunc), "Message from Main thread."); 

    20             Console.WriteLine("Main thread ends"); 

    21             Console.ReadLine(); 

    22         } 

    23         delegate string AsyncFuncDelegate(int userInput); 

    24         static string Func(int userInput) 

    25         { 

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

    27             Console.WriteLine("..."); 

    28             Thread.Sleep(5000); 

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

    30             return userInput.ToString(); 

    31         } 

    32         static void CallBackFunc(IAsyncResult ar) 

    33         { 

    34             AsyncResult result = ar as AsyncResult; 

    35             string inputMessage = result.AsyncState as string; 

    36             AsyncFuncDelegate caller = result.AsyncDelegate as AsyncFuncDelegate; 

    37             Console.WriteLine("call back starts"); 

    38             Console.WriteLine(inputMessage); 

    39             Console.WriteLine("The input number is : " + caller.EndInvoke(ar)); 

    40             Console.WriteLine("call back ends"); 

    41         } 

    42     } 

    43 }

    输出结果如下:

    Input number please...

    23

    Main thread ends

    Func start to run

    ...

    Func end to run

    call back starts

    Message from Main thread.

    The input number is : 23

    call back ends
     

  • 相关阅读:
    使用批处理文件轻松更改本地IP地址
    Aveiconifier是一个非常实用方便的制作ico格式文件的小工具~
    C#中选择文件的例子
    WindowsXP命令行修改服务启动选项
    Oracle中数据导入导出技巧
    hibernateTemplateOrder Results
    如何向 Microsoft 管理控制台添加证书管理器
    maven usages
    让Eclipse拥有像Visual Studio一样的强大的提示功能
    jsp页面跳转方法及区别
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3569156.html
Copyright © 2011-2022 走看看