Làm th? nào đ? g?i m?t Visual C# phương pháp không đ?ng b?

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 315582 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Microsoft.NET Framework làm cho nó d? dàng đ? g?i ch?c năng không đ?ng b?. G?i hàm không đ?ng b? gây ra h? th?ng th?c thi chúng trong b?i c?nh v? m?t ch? đ? ph? trong khi ch?c năng g?i đi?n tho?i ti?p t?c làm công vi?c khác. Trong m?t cu?c g?i đi?n h?nh ch?c năng (đ?ng b?), các ch?c năng đư?c thi hành ngay l?p t?c trên cùng m?t s?i mà th?c hi?n cu?c g?i. Các g?i hàm ch? cho các cu?c g?i đ? hoàn thành và nh?n đư?c các k?t qu? c?a các g?i trư?c khi ti?p t?c. Ngư?c l?i, khi b?n th?c hi?n cu?c g?i không đ?ng b?, b?n b?n có th? l?y các k?t qu? c?a các cu?c g?i không đ?ng b? sau này. Bài vi?t này minh ch?ng làm th? nào đ? làm đi?u này b?ng cách s? d?ng Visual C#.

Yêu c?u


Danh sách sau v?ch ra ph?n c?ng đư?c đ? ngh?, ph?n m?m, cơ s? h? t?ng m?ng và gói d?ch v? đư?c yêu c?u:
  • Microsoft Windows 2000 ho?c Microsoft Windows XP ho?c Microsoft Windows Server 2003
  • Visual Studio.NET ho?c Visual Studio 2005
Bài vi?t này gi? đ?nh r?ng b?n đ? quen thu?c v?i sau các ch? đ?:
  • Kêu g?i các phương pháp trong Visual C#
  • Làm th? nào đ? s? d?ng đ?i bi?u

Làm th? nào đ? th?c hi?n cu?c g?i không đ?ng b?

Không đ?ng b? các cu?c g?i đư?c th?c hi?n b?ng cách s? d?ng các đ?i bi?u. M?t đ?i bi?u là m?t đ?i tư?ng k?t thúc t?t đ?p m?t ch?c năng. Đ?i bi?u cung c?p m?t ch?c năng đ?ng b? và c?ng cung c?p các phương pháp đ? kêu g?i các ch?c năng gói không đ?ng b?. Các phương pháp đang BeginInvoke()EndInvoke(). Danh sách các tham s? c?a các phương pháp khác nhau tùy thu?c vào s? ch? k? c?a các ch?c năng ngư?i đ?p k?t thúc t?t đ?p. Lưu ? r?ng Visual Studio .NET IntelliSense tính năng không hi?n th? BeginInvoke()EndInvoke(), do đó, b?n không th?y chúng xu?t hi?n trong các ch?c năng danh sách khi b?n g?.

BeginInvoke() đư?c s? d?ng đ? b?t đ?u cu?c g?i không đ?ng b?. Nó có cùng m?t tham s? là hàm gói, c?ng v?i hai tham s? b? sung s? đư?c miêu t? sau này trong bài vi?t này. BeginInvoke() tr? l?i ngay l?p t?c và không ch? đ?i cho các cu?c g?i không đ?ng b? đ? hoàn thành. BeginInvoke() tr? v? m?t IAsyncResult đ?i tư?ng.

Các EndInvoke() ch?c năng đư?c s? d?ng đ? l?y k?t qu? c?a vi?c không đ?ng b? goïi ñeán. Nó có th? đư?c g?i là b?t c? lúc nào sau khi BeginInvoke(). N?u cu?c g?i không đ?ng b? đ? không hoàn thành đư?c nêu ra, EndInvoke() kh?i cho đ?n khi nó hoàn thành. Các tham s? c?a các EndInvoke() ch?c năng bao g?m các trongREF các tham s? ch?c năng gói có, c?ng v?i các IAsyncResult đ?i tư?ng đư?c tr? v? b?i BeginInvoke().

Sau đây là m?t ví d? v? m?t đ?i bi?u và c?a nó BeginInvoke()EndInvoke() phương pháp:
// The following delegate 
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;

// will have the following BeginInvoke() and EndInvoke methods:
IAsyncResult MethodDelegate.BeginInvoke(int iCallTime, out int iExecThread, AsyncCallback cb, object AsyncState); 

string MethodDelegate.EndInvoke (out int iExecThread, IAsyncResult ar) ;
				
Có b?n cách ph? bi?n đ? s? d?ng BeginInvoke()EndInvoke() đ? th?c hi?n cu?c g?i không đ?ng b?. Sau khi b?n g?i BeginInvoke()B?n có th?:
  • Tùy ch?n làm m?t s? công vi?c khác và sau đó s? d?ng EndInvoke().
  • Có đư?c m?t WaitHandle đó đư?c cung c?p b?i các IAsyncResult đ?i tư?ng, s? d?ng c?a nó WaitOne phương pháp đ? ngăn ch?n cho đ?n các WaitHandle tín hi?u, và sau đó g?i EndInvoke().
  • Thăm d? ? ki?n các IAsyncResult đ?i tư?ng đ? xác đ?nh khi các cu?c g?i không đ?ng b? đ? hoàn t?t, và sau đó g?i EndInvoke().
  • Có h? th?ng g?i m?t ch?c năng g?i l?i mà b?n ch? đ?nh. Ch?c năng g?i l?i này g?i EndInvoke() và các quá tr?nh k?t qu? c?a vi?c không đ?ng b? g?i khi nó đ? hoàn t?t.
M?u m? sau đây ch?ng minh nh?ng g?i các m?u và ngư?c l?i chúng v?i th?c hi?n m?t cu?c g?i đ?ng b? b?ng cách s? d?ng các ch?c năng sau đây:
string LongRunningMethod (int iCallTime, out int iExecThread)
{
	Thread.Sleep (iCallTime) ;
	iExecThread = AppDomain.GetCurrentThreadId ();
	return "MyCallTime was " + iCallTime.ToString() ;
}

				
LongRunningMethod() mô ph?ng m?t ch?c năng ch?y trong th?i gian dài c?a ng?. Nó tr? v? th?i gian ng? và ID c?a s?i ch? th?c hi?n nó. N?u b?n g?i nó không đ?ng b?, b?n th?y r?ng ID thread c?a th?c hi?n các thread là bi?t nó kh?i ch? đ? g?i đi?n tho?i.

Bư?c đ?u tiên là xác đ?nh ngư?i đ?p mà k?t thúc t?t đ?p ch?c năng:
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;
				

M?u 1: Kêu g?i m?t phương pháp đ?ng b?

M?u này ch?ng t? làm th? nào đ? g?i LongRunningMethod() đ?ng b? b?ng cách s? d?ng m?t MethodDelegate đ?i bi?u. Các m?u khác ngư?c l?i đi?u này b?ng cách làm cho các cu?c g?i không đ?ng b?.
  1. B?t đ?u Microsoft Visual Studio.NET ho?c Microsoft Visual Studio 2005.
  2. T?o m?t d? án Visual C# giao di?n đi?u khi?n ?ng d?ng m?i đư?c đ?t tên AsyncDemo.
  3. Thêm m?t class tên là AsyncDemo đư?c đ?nh ngh?a như sau các d? án trong m?t t?p tin .cs m?i:
    using System;
    using System.Threading ; 
    using System.Windows.Forms ;
    
    public class AsyncDemo
    {
    	string LongRunningMethod (int iCallTime, out int iExecThread)
    	{
    		Thread.Sleep (iCallTime) ;
    		iExecThread = AppDomain.GetCurrentThreadId ();
    		return "MyCallTime was " + iCallTime.ToString() ;
    	}
    
    	delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;
    
    	public void DemoSyncCall()
    	{
    		string s ;
    		int iExecThread;
    
    		// Create an instance of a delegate that wraps LongRunningMethod.
    		MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;  
    			
    		// Call LongRunningMethod using the delegate.
    		s = dlgt(3000, out iExecThread);  
    			
    		MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                            and the thread ID {1}", s, iExecThread.ToString() ) );
    	}
    }
    					
    Sau đó, l?p này ch?ng t? làm th? nào đ? th?c hi?n cu?c g?i không đ?ng b?. Ban đ?u, tuy nhiên, nó ch? ch?a các DemoSyncCall() phương pháp, trong đó ch?ng t? làm th? nào đ? g?i ngư?i đ?p đ?ng b?.
  4. Thêm m? sau trong n?i các Chính ch?c năng mà Visual Studio s? t? đ?ng t?o ra trong c?a b?n d? án:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoSyncCall() ;
    }
    					
  5. Nh?n CTRL + F5 đ? ch?y ?ng d?ng c?a b?n.

M?u 2: Kêu g?i m?t phương pháp không đ?ng b? b?ng cách s? d?ng các EndInvoke() Mô h?nh cu?c g?i

Trong ph?n này, các m?u invokes các cùng m?t phương pháp không đ?ng b?. Các mô h?nh cu?c g?i đư?c s? d?ng là đ? g?i BeginInvoke, làm m?t s? công vi?c trên ch? đ? chính, và sau đó g?i EndInvoke(). Lưu ? r?ng EndInvoke() không tr? l?i cho đ?n khi cu?c g?i không đ?ng b? đ? hoàn thành. Đi?u này mô h?nh g?i là h?u ích khi b?n mu?n có s?i ch? g?i đi?n tho?i làm vi?c t?i các đ?ng th?i các cu?c g?i không đ?ng b? th?c hi?n. Có làm vi?c x?y ra t?i các đ?ng th?i có th? c?i thi?n hi?u su?t c?a nhi?u ?ng d?ng. Tác v? thông thư?ng đ? ch?y không đ?ng b? b?ng cách này có t?p tin ho?c m?ng ho?t đ?ng.
  1. Thêm m?t phương pháp đ?t tên là DemoEndInvoke() đ? các AsyncDemo l?p h?c. Các DemoEndInvoke ch?c năng ch?ng t? làm th? nào đ? g?i các đ?i bi?u không đ?ng b?.
    public void DemoEndInvoke()
    {
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    	string s ;
    	int iExecThread;
    
    	// Initiate the asynchronous call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null);  
    
    	// Do some useful work here. This would be work you want to have
    	// run at the same time as the asynchronous call.
    
    	// Retrieve the results of the asynchronous call.
    	s = dlgt.EndInvoke (out iExecThread, ar) ;  
    
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                   and the number {1}", s, iExecThread.ToString() ) );
    }
    					
  2. Ch?nh s?a m? ngu?n cho Chính V? v?y mà nó ch?a m? sau đây:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoEndInvoke() ;
    }
    					
  3. Nh?n CTRL + F5 đ? ch?y ?ng d?ng c?a b?n.

M?u 3: G?i đi?n cho m?t phương pháp không đ?ng b? và cách s? d?ng m?t WaitHandle đ? ch? cho các cu?c g?i đ? hoàn thành


Trong ph?n này, các m?u g?i các phương pháp không đ?ng b? và ch? đ?i cho m?t WaitHandle trư?c khi nó g?i EndInvoke(). Các IAsyncResult đó là tr? l?i b?i BeginInvoke() có m?t AsyncWaitHandle b?t đ?ng s?n. Đ?c tính này tr? v? m?t WaitHandle đó báo hi?u khi đ? hoàn t?t các cu?c g?i không đ?ng b?. Đang ch? m?t WaitHandle là m?t k? thu?t ph? bi?n ch? đ? đ?ng b? hóa. Các ch? đ? cu?c g?i ch? đ?i các WaitHandle b?ng cách s? d?ng các WaitOne() phương pháp c?a các WaitHandle. WaitOne() ch?n cho đ?n khi các WaitHandle báo hi?u. Khi WaitOne() tr? v?, b?n có th? làm m?t s? công vi?c b? sung trư?c khi b?n g?i EndInvoke(). Như trong m?u trư?c đó, k? thu?t này r?t h?u ích cho th?c hi?n các ho?t đ?ng t?p tin ho?c m?ng mà n?u không s? ch?n các cu?c g?i ch? đ? chính.
  1. Thêm m?t ch?c năng đ?t tên DemoWaitHandle() đ? các AsyncDemo l?p h?c. Các DemoWaitHandle() ch?c năng ch?ng t? làm th? nào đ? g?i các đ?i bi?u không đ?ng b?.
    public void DemoWaitHandle ()
    {
    	string s ;
    	int iExecThread;
    
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    
    	// Initiate the asynchronous call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null); 
    
    	// Do some useful work here. This would be work you want to have
    	// run at the same time as the asynchronous call.
    
    	// Wait for the WaitHandle to become signaled.
    	ar.AsyncWaitHandle.WaitOne() ;
    
    	// Get the results of the asynchronous call.
    	s = dlgt.EndInvoke (out iExecThread, ar) ;
    			
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                     and the number {1}", s, iExecThread.ToString() ) );
    }
    					
  2. Ch?nh s?a m? ngu?n cho Chính V? v?y mà nó ch?a m? sau đây:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoWaitHandle () ;
    }
    					
  3. Nh?n CTRL + F5 đ? ch?y ?ng d?ng c?a b?n.

M?u 4: Kêu g?i m?t phương pháp không đ?ng b? b?ng cách s? d?ng m?u Polling Call

Trong ph?n này, các m?u cu?c thăm d? các IAsyncResult đ?i tư?ng đ? t?m ra khi các cu?c g?i không đ?ng b? đ? hoàn thành. Các IAsyncResult đ?i tư?ng đư?c tr? v? b?i BeginInvoke() có m?t IsCompleted b?t đ?ng s?n tr? v? S? th?t sau khi hoàn t?t cu?c g?i không đ?ng b?. B?n có th? sau đó g?i EndInvoke(). Mô h?nh cu?c g?i này r?t h?u ích n?u ?ng d?ng c?a b?n không liên t?c làm vi?c mà b?n không mu?n có ch?n b?i m?t cu?c g?i dài ch?y ch?c năng. A ?ng d?ng Microsoft Windows là m?t ví d? v? đi?u này. Ch? đ? chính c?a các ?ng d?ng Windows có th? ti?p t?c x? l? các đ?u vào ngư?i dùng trong khi m?t không đ?ng b? th?c hi?n m?t cu?c g?i. Nó có th? ki?m tra đ?nh k? IsCompleted đ? xem n?u cu?c g?i đ? hoàn thành. Nó g?i EndInvoke Khi IsCompleted tr? v? S? th?t. B?i v? EndInvoke() ch?n cho đ?n khi các ho?t đ?ng không đ?ng b? đư?c hoàn t?t, các ?ng d?ng không g?i nó cho đ?n khi nó bi?t r?ng chi?n d?ch đư?c hoàn t?t.
  1. Thêm m?t ch?c năng đ?t tên DemoPolling() đ? các AsyncDemo l?p h?c. Các DemoPolling() ch?c năng ch?ng t? làm th? nào đ? g?i các đ?i bi?u không đ?ng b? và s? d?ng ph?ng phi?u đ? xem n?u quá tr?nh này hoàn t?t.
    public void DemoPolling()
    {
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    	string s ;
    	int iExecThread;
    
    	// Initiate the asynchronous call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null); 
    
    	// Poll IAsyncResult.IsCompleted
    	while(ar.IsCompleted == false)
    	{
    		Thread.Sleep (10) ;  // pretend to so some useful work
    	}
    	s = dlgt.EndInvoke (out iExecThread, ar) ;
    
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                    and the number {1}", s, iExecThread.ToString() ) );
    }
    
    					
  2. Ch?nh s?a m? ngu?n cho Chính. Thay th? n?i dung c?a các ch?c năng v?i đo?n m? sau:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoPolling () ;
    }
    					
  3. Nh?n CTRL + F5 đ? ch?y ?ng d?ng c?a b?n.

M?u 5: Th?c hi?n m?t g?i l?i khi hoàn t?t m?t phương pháp không đ?ng b?

Trong ph?n này, các m?u cung c?p m?t đ?i bi?u g?i l?i đ? các BeginInvoke() ch?c năng h? th?ng th?c hi?n khi nào cu?c g?i không đ?ng b? đ? hoàn t?t. Các cu?c g?i g?i l?i EndInvoke() và các quá tr?nh k?t qu? c?a các cu?c g?i không đ?ng b?. Cu?c g?i này mô h?nh r?t h?u ích n?u các ch? đ? s? kh?i t?o cu?c g?i không đ?ng b? không c?n đ? x? l? các k?t qu? c?a cu?c g?i. H? th?ng invokes g?i l?i trên m?t ch? đ? khác v?i các ch? đ? initiating khi đ? hoàn t?t các cu?c g?i không đ?ng b?.

S? d?ng mô h?nh cu?c g?i này, b?n ph?i vư?t qua m?t đ?i bi?u c?a các lo?i AsyncCallback như tham s? th? hai đ? cu?i cùng c?a các BeginInvoke() ch?c năng. BeginInvoke() c?ng có m?t tham s? cu?i cùng c?a lo?i đ?i tư?ng vào đó b?n có th? vư?t qua b?t k? đ?i tư?ng. Đ?i tư?ng này là dành cho c?a b?n ch?c năng g?i l?i khi nó đư?c vi?n d?n. M?t trong nh?ng s? d?ng quan tr?ng cho tham s? này là ph?i vư?t qua các đ?i bi?u đư?c s? d?ng đ? b?t đ?u cu?c g?i. G?i l?i ch?c năng có th? sau đó s? d?ng các EndInvoke() ch?c năng đó đ?i bi?u đ? hoàn thành các cu?c g?i. Đây là mô h?nh cu?c g?i đư?c th? hi?n dư?i đây.
  1. Thêm hai là phương pháp đ?t tên là DemoCallback()MyAsyncCallback() đ? các AsyncDemo l?p h?c. Các DemoCallback() phương pháp ch?ng t? làm th? nào đ? g?i các đ?i bi?u không đ?ng b?. Nó s? d?ng m?t đ?i bi?u đ? b?c các MyAsyncCallback() phương pháp, mà h? th?ng các cu?c g?i khi chi?n d?ch không đ?ng b? đ? hoàn t?t. MyAsyncCallback() các cu?c g?i EndInvoke().
    public void DemoCallback()
    {
    	MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
    	string s ;
    	int iExecThread;
    
    	// Create the callback delegate.
    	AsyncCallback cb = new AsyncCallback(MyAsyncCallback);
    
    	// Initiate the Asynchronous call passing in the callback delegate
    	// and the delegate object used to initiate the call.
    	IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, cb, dlgt); 
    }
    
    public void MyAsyncCallback(IAsyncResult ar)
    {
    	string s ;
    	int iExecThread ;
    
    	// Because you passed your original delegate in the asyncState parameter
    	// of the Begin call, you can get it back here to complete the call.
    	MethodDelegate dlgt = (MethodDelegate) ar.AsyncState;
    
    	// Complete the call.
    	s = dlgt.EndInvoke (out iExecThread, ar) ;
    
    	MessageBox.Show (string.Format ("The delegate call returned the string:   \"{0}\", 
                                    and the number {1}", s, iExecThread.ToString() ) );
    }
    
    					
  2. Ch?nh s?a m? ngu?n cho Chính. Thay th? n?i dung c?a các ch?c năng v?i đo?n m? sau:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoCallback() ;
    }
    					
  3. Nh?n CTRL + F5 đ? ch?y ?ng d?ng c?a b?n.

Thu?c tính

ID c?a bài: 315582 - L?n xem xét sau cùng: 27 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
T? khóa: 
kbhowtomaster kbmt KB315582 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:315582

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com