Bir Visual C# yöntemi zaman uyumsuz olarak nasıl

Makale çevirileri Makale çevirileri
Makale numarası: 315582 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Microsoft .NET Framework işlevlerinin zaman uyumsuz olarak çağırmak kolaylaştırır. Arama işlevi başka iş devam ederken bunları ikincil bir iş parçacığında arka planda çalıştırmak sistem işlevlerinin zaman uyumsuz olarak çağırmak neden olur. Normal (zaman uyumlu) bir işlev çağrısında işlev hemen çağrı yapan aynı iş parçacığında yürütülür. Arama işlevi, arama için bekleyeceği ve devam etmeden önce çağrının sonuçlarını alır. Buna ek olarak, zaman uyumsuz bir çağrı yaptığınızda, daha sonra zaman uyumsuz arama sonuçlarını alın. Bu makalede, Visual C# kullanarak bunu gösterilmiştir.

Gereksinimler


Aşağıdaki listede, gereksinim duyulan donanım, yazılım, ağ altyapısı ve hizmet paketleri önerilmektedir:
  • Microsoft Windows 2000 veya Microsoft Windows XP veya Microsoft Windows Server 2003
  • Visual Studio .NET veya Visual Studio 2005
Bu makalede, aşağıdaki konularda bilgi sahibi olduğunuz varsayılmaktadır:
  • Visual C# [NULL]'yöntemleri çağırmadan
  • Temsilcilerin nasıl kullanılır?

Nasıl yapılır: zaman uyumsuz aramalar yapma

Zaman uyumsuz çağrı temsilcilerin kullanılarak yapılır. Temsilci bir işlev kaydırılan bir nesnedir. Temsilcilerin zaman uyumlu bir işlevi sağlar ve ayrıca kaydırılan işlevi zaman uyumsuz olarak çağırmak için yöntemleri sağlar. Bu, BeginInvoke() ve EndInvoke() yöntemlerdir. Bu yöntem parametre listeleri imzası temsilci kaydırılan işlevi bağlı olarak değişir. Dikkat Visual Studio .NET ıntellisense özelliği BeginInvoke() ve EndInvoke() görüntülemez, siz yazarken işlevi listeler; bu nedenle, bunların görünür görmezsiniz.

BeginInvoke(), zaman uyumsuz çağrı başlatmak için kullanılır. Bu, kaydırılmış işlevi ile aynı parametreleri yanı sıra, bu makalenin sonraki bölümlerinde açıklanan iki ek parametreler vardır. BeginInvoke() hemen döner ve tamamlamak zaman uyumsuz arama için bekleyin. BeginInvoke() bir ıasyncresult nesnesi döndürür.

EndInvoke() işlevi, zaman uyumsuz arama sonuçlarını almak için kullanılır. Istediğiniz zaman BeginInvoke() sonra çağrılabilir. Bu tamamlanıncaya kadar zaman uyumsuz çağrı henüz EndInvoke() blokları tamamlanmadı. out ve kaydırılan işlev ref parametreleri artı BeginInvoke() tarafından döndürülen ıasyncresult nesnesi EndInvoke() işlevinin parametre içerir.

Bir temsilci ve BeginInvoke() ve EndInvoke() yöntemlerini örneği aşağıda verilmektedir:
// 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) ;
				
BeginInvoke() ve EndInvoke() zaman uyumsuz arama yapmak için kullanılacak ortak dört yolu vardır. BeginInvoke() çağırdıktan sonra aşağıdakileri yapabilirsiniz:
  • Isteğe bağlı olarak başka bir iş yapın ve sonra EndInvoke().
  • ıasyncresult nesnesi tarafından sağlanan bir WaitHandle elde WaitHandle'a sinyal kadar engellemek için WaitOne yöntemini kullanın ve sonra EndInvoke() çağırın.
  • ıasyncresult nesnesi, zaman uyumsuz çağrı tamamladığında belirlemek ve EndInvoke() ' ı çağırmak için yoklar.
  • Belirttiğiniz bir geri arama işlevini çağıracak sistemi vardır. Bu geri arama işlevi EndInvoke() çağırır ve tamamlandığında sonuçları zaman uyumsuz çağrı işler.
Bu desen arayın ve aşağıdaki işlevi kullanarak, zaman uyumlu bir çağrı yapma ile Karşıtlık aşağıdaki kod örnekleri gösterilmektedir:
string LongRunningMethod (int iCallTime, out int iExecThread)
{
	Thread.Sleep (iCallTime) ;
	iExecThread = AppDomain.GetCurrentThreadId ();
	return "MyCallTime was " + iCallTime.ToString() ;
}

				
LongRunningMethod() uyku olarak uzun süredir çalışan bir işlev taklit eder. Bu bekleme süresi, çalışan iş parçacığı KIMLIĞI döndürür. Zaman uyumsuz olarak çağırmak, yürütme iş parçacığının iş parçacığı KIMLIĞI arama iş parçacığının farklı olduğunu öğrenin.

Ilk adım, işlev kaydırılan temsilci tanımlamaktır:
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;
				

Örnek 1: BIR yöntemi zaman uyumlu olarak arama

Bu örnek, LongRunningMethod()MethodDelegate temsilci kullanarak zaman uyumlu çağrı gösterilmiştir. Diğer örnekler, bu zaman uyumsuz arama yaparak Karşıtlık.
  1. Microsoft Visual Studio 2005 ya da Microsoft Visual Studio. NET'i başlatın.
  2. AsyncDemo adlı yeni bir Visual C# Console Application projesi oluşturun.
  3. Projeye bir .cs dosyasına aşağıdaki gibi tanımlanır AsyncDemo adlı bir class:
    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() ) );
    	}
    }
    					
    daha sonra bu sınıfın zaman uyumsuz çağrı gösterilmiştir. Başlangıçta, ancak bu yalnızca temsilci zaman uyumlu çağrı gösterilmiştir DemoSyncCall() yöntemini içerir.
  4. Gövde metninde, Visual Studio, projenizde otomatik olarak oluşturduğu ana işlevi aşağıdaki kodu ekleyin:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoSyncCall() ;
    }
    					
  5. Uygulamanızı CTRL + F5 tuşuna basın.

Örnek 2: BIR yöntem zaman uyumsuz olarak EndInvoke() arama deseni kullanarak arama

Bu bölümde, örnek aynı yöntemi zaman uyumsuz olarak çağırır. Kullanılan arama deseni Beginınvoke aramak için bazı ana iş parçacığı üzerinde çalışır ve sonra EndInvoke() çağırın. Zaman uyumsuz çağrı tamamlanana kadar EndInvoke() döndürmüyor unutmayın. Bu arama deseni yararlıdır çağıran iş parçacığına sahip olmasını istediğinizde iş aynı anda zaman uyumsuz çağrı yürütülüyor. Aynı anda gerçekleşen çalışmanın sahip birçok uygulama performansını artırabilir. Zaman uyumsuz olarak, bu şekilde çalıştırmak için ortak görevleri dosya veya ağ operasyonlardır.
  1. DemoEndInvoke()AsyncDemo sınıfına adlı bir yöntemi ekleyin. DemoEndInvoke işlevi, temsilci zaman uyumsuz olarak çağırmak gösterilmiştir.
    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. Aşağıdaki kodu içeren, ana için kaynak kodunu düzenleyin:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoEndInvoke() ;
    }
    					
  3. Uygulamanızı CTRL + F5 tuşuna basın.

Örnek 3: BIR yöntem zaman uyumsuz çağrı ve tamamlanması için bekle'çağrısı için için BIR WaitHandle kullanma


Bu bölümdeki örnek yöntemi zaman uyumsuz olarak çağırır ve önce onu EndInvoke() çağrıları için bir WaitHandle bekler. BeginInvoke() tarafından döndürülen ıasyncresult bir AsyncWaitHandle özelliği vardır. Bu özellik, zaman uyumsuz çağrı tamamladığında, sinyal bir WaitHandle döndürür. Bir WaitHandle bekleyen bir ortak iş parçacığı eşitleme tekniğidir. WaitHandleWaitOne() yöntemini kullanarak, arama iş parçacığı üzerinde WaitHandle bekler. WaitHandle'a sinyal kadar WaitOne() engeller. WaitOne() döndürdüğünde, EndInvoke() aramadan önce bazı ek iş yapabilirsiniz. Önceki örnek olarak, aksi takdirde Arama ana iş parçacığı engelleyen dosya veya ağ işlemlerini yürütmek için bu yöntem kullanışlıdır.
  1. DemoWaitHandle()AsyncDemo sınıfına adında bir işlev ekleyin. DemoWaitHandle() işlevi, temsilci zaman uyumsuz olarak çağırmak gösterilmiştir.
    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. Aşağıdaki kodu içeren, ana için kaynak kodunu düzenleyin:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoWaitHandle () ;
    }
    					
  3. Uygulamanızı CTRL + F5 tuşuna basın.

4. Örnek: BIR yöntem zaman uyumsuz olarak Polling arama deseni kullanarak arama

Bu bölümde, zaman uyumsuz çağrı tamamladığında öğrenmek için ıasyncresult nesnesi örnek yoklar. Zaman uyumsuz çağrı tamamlandıktan sonra doğru verir ıscompleted özelliği BeginInvoke() tarafından döndürülen ıasyncresult nesnesi var. Sonra EndInvoke() çağırabilirsiniz. Bu arama deseni, uygulamanızın bir uzun süre çalışan işlev çağrısı tarafından engellenmiş istemediğiniz devam eden iş varsa yararlıdır. Microsoft Windows uygulaması, bu bir örnektir. <a0>Windows</a0> uygulamasının ana iş parçacığı, bir zaman uyumsuz çağrı çalışırken kullanıcı girişini işleme devam edebilirsiniz. Bu, düzenli aralıklarla ıscompleted aramayı tamamladı görmek için denetleyebilirsiniz. Bu, doğruıscompleted döndürdüğünde Endınvoke çağırır. Zaman uyumsuz işlem tamamlanana kadar EndInvoke() engellediğinden, operasyonun tamamlandığını öğrenene dek uygulama, çağırmaz.
  1. DemoPolling()AsyncDemo sınıfına adında bir işlev ekleyin. DemoPolling() işlevi, temsilci zaman uyumsuz olarak çağırmak ve işlemin eksiksiz olup olmadığını görmek için yoklama gösterilmiştir.
    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. Kaynak kodu için ana düzenleyin. Işlev içeriğini aşağıdaki kodla değiştirin:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoPolling () ;
    }
    					
  3. Uygulamanızı CTRL + F5 tuşuna basın.

Örnek 5: zaman uyumsuz bir yöntem tamamlar, yürütülen bir geri arama

Bu bölümde, örnek bir geri arama temsilciye zaman uyumsuz çağrı tamamlandıktan sonra sistem çalışır BeginInvoke() işlevi sağlar. Geri EndInvoke() çağrı yapar ve sonuçları zaman uyumsuz çağrı işler. Arama sonuçlarını işlemek zaman uyumsuz çağrı başlatır, iş parçacığının gerekmiyorsa, bu arama deseni yararlıdır. Zaman uyumsuz çağrı tamamlandığında, sistemi başlatan iş parçacığı dışında başka bir iş parçacığı üzerinde geri çağırır.

Bu çağrı desen kullanmak için <a0></a0>, <a1>Tür</a1> AsyncCallback temsilci BeginInvoke() işlevinin saniye ve en son parametre olarak geçmelidir. BeginInvoke(), herhangi bir nesne geçirebilirsiniz nesnesi yazın son bir parametresi de vardır. Bu nesne, yeniden ba?lat?ld???nda, geri arama işlevi için kullanılabilir. Bir önemli bu parametre, aramayı başlatmak için kullanılan temsilci geçirmek için kullanılır. Geri arama işlevi, daha sonra aramayı tamamlamak için temsilci EndInvoke() işlevini kullanabilirsiniz. Bu arama deseni, aşağıda gösterilmiştir.
  1. DemoCallback()MyAsyncCallback()AsyncDemo sınıfına adlı bir iki yöntemi ekleyin. DemoCallback() yöntemi temsilci zaman uyumsuz olarak çağırmak gösterilmiştir. Zaman uyumsuz işlem tamamlandığında, Sistem çağrıları MyAsyncCallback() yöntemi kaydırmak için temsilci kullanır. MyAsyncCallback()EndInvoke() çağırır.
    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. Kaynak kodu için ana düzenleyin. Işlev içeriğini aşağıdaki kodla değiştirin:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoCallback() ;
    }
    					
  3. Uygulamanızı CTRL + F5 tuşuna basın.

Özellikler

Makale numarası: 315582 - Last Review: 11 Aralık 2006 Pazartesi - Gözden geçirme: 4.3
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
Anahtar Kelimeler: 
kbmt kbhowtomaster KB315582 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:315582

Geri Bildirim Ver

 

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