国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C#異步調(diào)用四大方法詳解
C#異步調(diào)用四大方法詳解 收藏
讓我們首先了解下什么時候用到C#異步調(diào)用:
.NET Framework 允許您C#異步調(diào)用任何方法。定義與您需要調(diào)用的方法具有相同簽名的委托;公共語言運行庫將自動為該委托定義具有適當簽名的 BeginInvoke 和 EndInvoke 方法。

BeginInvoke 方法:用于啟動C#異步調(diào)用。它與您需要異步執(zhí)行的方法具有相同的參數(shù),只不過還有兩個額外的參數(shù)(將在稍后描述)。BeginInvoke 立即返回,不等待C#異步調(diào)用完成。BeginInvoke 返回 IasyncResult,可用于監(jiān)視調(diào)用進度。
EndInvoke 方法:用于檢索C#異步調(diào)用結(jié)果。調(diào)用 BeginInvoke 后可隨時調(diào)用 EndInvoke 方法;如果C#異步調(diào)用未完成,EndInvoke 將一直阻塞到C#異步調(diào)用完成。EndInvoke 的參數(shù)包括您需要異步執(zhí)行的方法的 out 和 ref 參數(shù)(在 Visual Basic 中為 ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。
注意   Visual Studio .NET 中的智能感知功能會顯示 BeginInvoke 和 EndInvoke 的參數(shù)。如果您沒有使用 Visual Studio 或類似的工具,或者您使用的是 C# 和 Visual Studio .NET,請參見異步方法簽名獲取有關(guān)運行庫為這些方法定義的參數(shù)的描述。
本主題中的代碼演示了四種使用 BeginInvoke 和 EndInvoke 進行C#異步調(diào)用的常用方法。調(diào)用了 BeginInvoke 后,可以:
  • 進行某些操作,然后調(diào)用 EndInvoke 一直阻塞到調(diào)用完成。
  • 使用 IAsyncResult.AsyncWaitHandle 獲取 WaitHandle,使用它的 WaitOne 方法將執(zhí)行一直阻塞到發(fā)出 WaitHandle 信號,然后調(diào)用 EndInvoke。
  • 輪詢由 BeginInvoke 返回的 IAsyncResult,確定C#異步調(diào)用何時完成,然后調(diào)用 EndInvoke。
  • 將用于回調(diào)方法的委托傳遞給 BeginInvoke。該方法在C#異步調(diào)用完成后在 ThreadPool 線程上執(zhí)行,它可以調(diào)用 EndInvoke。
警告:始終在C#異步調(diào)用完成后調(diào)用 EndInvoke。

測試方法和異步委托
四個示例全部使用同一個長期運行的測試方法 TestMethod。該方法顯示一個表明它已開始處理的控制臺信息,休眠幾秒鐘,然后結(jié)束。TestMethod 有一個 out 參數(shù)(在 Visual Basic 中為 ByRef),它演示了如何將這些參數(shù)添加到 BeginInvoke 和 EndInvoke 的簽名中。您可以用類似的方式處理 ref 參數(shù)(在 Visual Basic 中為 ByRef)。
下面的代碼示例顯示 TestMethod 以及代表 TestMethod 的委托;若要使用任一示例,請將示例代碼追加到這段代碼中。
注意   為了簡化這些示例,TestMethod 在獨立于 Main() 的類中聲明。或者,TestMethod 可以是包含 Main() 的同一類中的 static 方法(在 Visual Basic 中為 Shared)。
 
1、C#異步調(diào)用四大方法之使用 EndInvoke 等待異步調(diào)用
異步執(zhí)行方法的最簡單方式是以 BeginInvoke 開始,對主線程執(zhí)行一些操作,然后調(diào)用 EndInvoke。EndInvoke 直到C#異步調(diào)用完成后才返回。這種技術(shù)非常適合文件或網(wǎng)絡(luò)操作,但是由于它阻塞 EndInvoke,所以不要從用戶界面的服務線程中使用它。
view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading;  
 
namespace ConsoleAppAsync  
{  
    // The delegate must have the same signature as the method       
    // you want to call asynchronously.       
    public delegate string AsyncDelegate(int callDuration, out int threadId);  
 
    public class AsyncDemo  
    {  
        // The method to be executed asynchronously.       
        //       
        public string TestMethod(int callDuration, out int threadId)  
        {  
            Console.WriteLine("Test method begins.");  
            Thread.Sleep(callDuration);  
            threadId = AppDomain.GetCurrentThreadId();  
            return "MyCallTime was " + callDuration.ToString();  
        }  
    }  
 
    class Program1  
    {  
        static void Main(string[] args)  
        {  
            // The asynchronous method puts the thread id here.       
            int threadId;  
 
            // Create an instance of the test class.       
            AsyncDemo ad = new AsyncDemo();  
 
            // Create the delegate.       
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
 
            // Initiate the asychronous call.       
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, null, null);  
 
            Thread.Sleep(0);  
            Console.WriteLine("Main thread {0} does some work.",AppDomain.GetCurrentThreadId());  
 
            // Call EndInvoke to Wait for          
            //the asynchronous call to complete,       
            // and to retrieve the results.       
            string ret = dlgt.EndInvoke(out threadId, ar);  
 
            Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, ret);  
 
        }  
    }  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleAppAsync
{
    // The delegate must have the same signature as the method    
    // you want to call asynchronously.    
    public delegate string AsyncDelegate(int callDuration, out int threadId);
    public class AsyncDemo
    {
        // The method to be executed asynchronously.    
        //    
        public string TestMethod(int callDuration, out int threadId)
        {
            Console.WriteLine("Test method begins.");
            Thread.Sleep(callDuration);
            threadId = AppDomain.GetCurrentThreadId();
            return "MyCallTime was " + callDuration.ToString();
        }
    }
    class Program1
    {
        static void Main(string[] args)
        {
            // The asynchronous method puts the thread id here.    
            int threadId;
            // Create an instance of the test class.    
            AsyncDemo ad = new AsyncDemo();
            // Create the delegate.    
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
            // Initiate the asychronous call.    
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, null, null);
            Thread.Sleep(0);
            Console.WriteLine("Main thread {0} does some work.",AppDomain.GetCurrentThreadId());
            // Call EndInvoke to Wait for       
            //the asynchronous call to complete,    
            // and to retrieve the results.    
            string ret = dlgt.EndInvoke(out threadId, ar);
            Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, ret);
        }
    }
}
 
運行結(jié)果:
Main thread 4332 does some work.
Test method begins.
The call executed on thread 3640,with return value "MyCallTime was 5000".
請按任意鍵繼續(xù). . .
 
2、C#異步調(diào)用四大方法之使用 WaitHandle 等待異步調(diào)用
等待 WaitHandle 是一項常用的線程同步技術(shù)。您可以使用由 BeginInvoke 返回的 IAsyncResult 的 AsyncWaitHandle 屬性來獲取 WaitHandle。C#異步調(diào)用完成時會發(fā)出 WaitHandle 信號,而您可以通過調(diào)用它的 WaitOne 等待它。
如果您使用 WaitHandle,則在C#異步調(diào)用完成之后,但在通過調(diào)用 EndInvoke 檢索結(jié)果之前,可以執(zhí)行其他處理。
view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading;  
 
namespace ConsoleAppAsync  
{  
    // The delegate must have the same signature as the method       
    // you want to call asynchronously.       
    public delegate string AsyncDelegate(int callDuration, out int threadId);  
 
    public class AsyncDemo  
    {  
        // The method to be executed asynchronously.       
        //       
        public string TestMethod(int callDuration, out int threadId)  
        {  
            Console.WriteLine("Test method begins.");  
            Thread.Sleep(callDuration);  
            threadId = AppDomain.GetCurrentThreadId();  
            return "MyCallTime was " + callDuration.ToString();  
        }  
    }  
 
    class Program2  
    {  
        static void Main(string[] args)  
        {  
            // The asynchronous method puts the thread id here.       
            int threadId;  
 
            // Create an instance of the test class.       
            AsyncDemo ad = new AsyncDemo();  
 
            // Create the delegate.       
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
 
            // Initiate the asychronous call.       
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, null, null);  
 
            Thread.Sleep(0);  
            Console.WriteLine("Main thread {0} does some work.",AppDomain.GetCurrentThreadId());  
 
            // Wait for the WaitHandle to become signaled.       
            ar.AsyncWaitHandle.WaitOne();  
 
            // Perform additional processing here.       
            // Call EndInvoke to retrieve the results.       
            string ret = dlgt.EndInvoke(out threadId, ar);  
 
            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);  
        }  
    }  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleAppAsync
{
    // The delegate must have the same signature as the method    
    // you want to call asynchronously.    
    public delegate string AsyncDelegate(int callDuration, out int threadId);
    public class AsyncDemo
    {
        // The method to be executed asynchronously.    
        //    
        public string TestMethod(int callDuration, out int threadId)
        {
            Console.WriteLine("Test method begins.");
            Thread.Sleep(callDuration);
            threadId = AppDomain.GetCurrentThreadId();
            return "MyCallTime was " + callDuration.ToString();
        }
    }
    class Program2
    {
        static void Main(string[] args)
        {
            // The asynchronous method puts the thread id here.    
            int threadId;
            // Create an instance of the test class.    
            AsyncDemo ad = new AsyncDemo();
            // Create the delegate.    
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
            // Initiate the asychronous call.    
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, null, null);
            Thread.Sleep(0);
            Console.WriteLine("Main thread {0} does some work.",AppDomain.GetCurrentThreadId());
            // Wait for the WaitHandle to become signaled.    
            ar.AsyncWaitHandle.WaitOne();
            // Perform additional processing here.    
            // Call EndInvoke to retrieve the results.    
            string ret = dlgt.EndInvoke(out threadId, ar);
            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);
        }
    }
}
 
運行結(jié)果:
Main thread 6864 does some work.
Test method begins.
The call executed on thread 7044, with return value "MyCallTime was 3000".
請按任意鍵繼續(xù). . .
 
3、C#異步調(diào)用四大方法之輪詢異步調(diào)用完成
您可以使用由 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 屬性來發(fā)現(xiàn)C#異步調(diào)用何時完成。從用戶界面的服務線程中進行C#異步調(diào)用時可以執(zhí)行此操作。輪詢完成允許用戶界面線程繼續(xù)處理用戶輸入。
view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading;  
 
namespace ConsoleAppAsync  
{  
    // The delegate must have the same signature as the method       
    // you want to call asynchronously.       
    public delegate string AsyncDelegate(int callDuration, out int threadId);  
 
    public class AsyncDemo  
    {  
        // The method to be executed asynchronously.       
        //       
        public string TestMethod(int callDuration, out int threadId)  
        {  
            Console.WriteLine("Test method begins.");  
            Thread.Sleep(callDuration);  
            threadId = AppDomain.GetCurrentThreadId();  
            return "MyCallTime was " + callDuration.ToString();  
        }  
    }  
 
    class Program3  
    {  
        static void Main(string[] args)  
        {  
            // The asynchronous method puts the thread id here.       
            int threadId;  
 
            // Create an instance of the test class.       
            AsyncDemo ad = new AsyncDemo();  
 
            // Create the delegate.       
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
 
            // Initiate the asychronous call.       
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, null, null);  
 
            // Poll while simulating work.       
            while (ar.IsCompleted == false)  
            {  
                Thread.Sleep(10);  
            }  
 
            // Call EndInvoke to retrieve the results.       
            string ret = dlgt.EndInvoke(out threadId, ar);  
 
            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);  
        }  
    }  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleAppAsync
{
    // The delegate must have the same signature as the method    
    // you want to call asynchronously.    
    public delegate string AsyncDelegate(int callDuration, out int threadId);
    public class AsyncDemo
    {
        // The method to be executed asynchronously.    
        //    
        public string TestMethod(int callDuration, out int threadId)
        {
            Console.WriteLine("Test method begins.");
            Thread.Sleep(callDuration);
            threadId = AppDomain.GetCurrentThreadId();
            return "MyCallTime was " + callDuration.ToString();
        }
    }
    class Program3
    {
        static void Main(string[] args)
        {
            // The asynchronous method puts the thread id here.    
            int threadId;
            // Create an instance of the test class.    
            AsyncDemo ad = new AsyncDemo();
            // Create the delegate.    
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
            // Initiate the asychronous call.    
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, null, null);
            // Poll while simulating work.    
            while (ar.IsCompleted == false)
            {
                Thread.Sleep(10);
            }
            // Call EndInvoke to retrieve the results.    
            string ret = dlgt.EndInvoke(out threadId, ar);
            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);
        }
    }
}
 
運行結(jié)果:
Test method begins.
The call executed on thread 5300, with return value "MyCallTime was 3000".
請按任意鍵繼續(xù). . .
 
4、C#異步調(diào)用四大方法之異步調(diào)用完成時執(zhí)行回調(diào)方法
如果啟動異步調(diào)用的線程不需要處理調(diào)用結(jié)果,則可以在調(diào)用完成時執(zhí)行回調(diào)方法?;卣{(diào)方法在 ThreadPool 線程上執(zhí)行。
要使用回調(diào)方法,必須將代表該方法的 AsyncCallback 委托傳遞給 BeginInvoke。也可以傳遞包含回調(diào)方法將要使用的信息的對象。例如,可以傳遞啟動調(diào)用時曾使用的委托,以便回調(diào)方法能夠調(diào)用 EndInvoke。
view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading;  
 
namespace ConsoleAppAsync  
{  
    // The delegate must have the same signature as the method       
    // you want to call asynchronously.       
    public delegate string AsyncDelegate(int callDuration, out int threadId);  
 
    public class AsyncDemo  
    {  
        // The method to be executed asynchronously.  
        public string TestMethod(int callDuration, out int threadId)  
        {  
            Console.WriteLine("Test method begins.");  
            Thread.Sleep(callDuration);  
            threadId = AppDomain.GetCurrentThreadId();  
            return "MyCallTime was " + callDuration.ToString();  
        }  
    }  
 
    class Program4  
    {  
        // Asynchronous method puts the thread id here.       
        private static int threadId;  
        static void Main(string[] args)  
        {  
            // Create an instance of the test class.       
            AsyncDemo ad = new AsyncDemo();  
 
            // Create the delegate.       
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);  
 
            // Initiate the asychronous call.    Include an AsyncCallback       
            // delegate representing the callback method, and the data       
            // needed to call EndInvoke.       
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, new AsyncCallback(CallbackMethod),dlgt);  
 
            Console.WriteLine("Press Enter to close application.");  
            Console.ReadLine();  
        }  
 
        // Callback method must have the same signature as the       
        // AsyncCallback delegate.       
        static void CallbackMethod(IAsyncResult ar)  
        {  
            // Retrieve the delegate.       
            AsyncDelegate dlgt = (AsyncDelegate)ar.AsyncState;  
 
            // Call EndInvoke to retrieve the results.       
            string ret = dlgt.EndInvoke(out threadId, ar);  
            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);  
        }  
 
    }  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleAppAsync
{
    // The delegate must have the same signature as the method    
    // you want to call asynchronously.    
    public delegate string AsyncDelegate(int callDuration, out int threadId);
    public class AsyncDemo
    {
        // The method to be executed asynchronously.
        public string TestMethod(int callDuration, out int threadId)
        {
            Console.WriteLine("Test method begins.");
            Thread.Sleep(callDuration);
            threadId = AppDomain.GetCurrentThreadId();
            return "MyCallTime was " + callDuration.ToString();
        }
    }
    class Program4
    {
        // Asynchronous method puts the thread id here.    
        private static int threadId;
        static void Main(string[] args)
        {
            // Create an instance of the test class.    
            AsyncDemo ad = new AsyncDemo();
            // Create the delegate.    
            AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
            // Initiate the asychronous call.    Include an AsyncCallback    
            // delegate representing the callback method, and the data    
            // needed to call EndInvoke.    
            IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId, new AsyncCallback(CallbackMethod),dlgt);
            Console.WriteLine("Press Enter to close application.");
            Console.ReadLine();
        }
        // Callback method must have the same signature as the    
        // AsyncCallback delegate.    
        static void CallbackMethod(IAsyncResult ar)
        {
            // Retrieve the delegate.    
            AsyncDelegate dlgt = (AsyncDelegate)ar.AsyncState;
            // Call EndInvoke to retrieve the results.    
            string ret = dlgt.EndInvoke(out threadId, ar);
            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);
        }
    }
}
 
運行結(jié)果:
Press Enter to close application.
Test method begins.
The call executed on thread 7632, with return value "MyCallTime was 3000".

C#異步調(diào)用四大方法的基本內(nèi)容就向你介紹到這里,希望對你了解和學習C#異步調(diào)用有所幫助。
改自:
 
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/aspnet2002web/archive/2010/12/17/6082977.aspx
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/aspnet2002web/archive/2010/12/17/6082977.aspx
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/aspnet2002web/archive/2010/12/17/6082977.aspx
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MSDN-異步編程概述 [C#] - bitman的專欄 - 博客園
C#異步編程概述
C#異步調(diào)用(Asynchronou Delegate)
Implementing the CLR Asynchronous Programming Model
C#多線程之旅(3):線程池
C#多線程之旅(3)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服