Bagaimana memanggil metode Visual C# asynchronously

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 315582 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Microsoft.NET Framework memudahkan untuk memanggil fungsi asynchronously. Memanggil fungsi asynchronously menyebabkan sistem untuk mengeksekusi mereka dalam latar belakang pada thread sekunder sementara fungsi panggilan terus melakukan pekerjaan lain. Dalam khas (sinkron) fungsi panggilan, fungsi dijalankan langsung di thread yang sama yang membuat panggilan. The memanggil fungsi menunggu panggilan untuk menyelesaikan dan menerima hasil panggilan sebelum melanjutkan. Sebaliknya, ketika Anda membuat panggilan asynchronous, Anda mengambil hasil panggilan asynchronous kemudian. Artikel ini menunjukkan bagaimana melakukan ini dengan menggunakan Visual C#.

Persyaratan


Daftar berikut menguraikan perangkat keras yang disarankan, perangkat lunak, jaringan infrastruktur dan paket layanan yang diperlukan:
  • Microsoft Windows 2000 atau Microsoft Windows XP atau Microsoft Windows Server 2003
  • Visual Studio.NET atau Visual Studio 2005
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan berikut topik:
  • Memanggil metode dalam Visual C#
  • Cara menggunakan delegasi

Bagaimana membuat panggilan Asynchronous

Asynchronous panggilan yang dibuat dengan menggunakan delegasi. Delegasi adalah objek yang membungkus fungsi. Delegasi memberikan fungsi sinkron dan juga memberikan metode untuk memanggil fungsi dibungkus asynchronously. Metode-metode adalah BeginInvoke() dan EndInvoke(). Daftar parameter dari metode ini bervariasi tergantung pada tanda tangan dari fungsi yang delegasi wraps. Perhatikan bahwa Visual Studio .Fitur NET IntelliSense tidak menampilkan BeginInvoke() dan EndInvoke(), jadi Anda tidak melihat mereka muncul dalam fungsi daftar saat Anda mengetik.

BeginInvoke() digunakan untuk memulai panggilan asynchronous. Ini memiliki yang sama parameter sebagai fungsi dibungkus, ditambah dua parameter tambahan yang akan dijelaskan nanti dalam artikel ini. BeginInvoke() kembali segera dan tidak menunggu panggilan asynchronous untuk menyelesaikan. BeginInvoke() kembali IAsyncResult objek.

The EndInvoke() fungsi yang digunakan untuk mengambil hasil umpamakan panggilan. Dapat disebut kapan saja setelah BeginInvoke(). Jika panggilan asynchronous belum menyelesaikan Namun, EndInvoke() blok sampai selesai. Parameter EndInvoke() fungsi termasuk keluar dan REF parameter yang dibungkus fungsi, ditambah The IAsyncResult obyek yang dikembalikan oleh BeginInvoke().

Berikut adalah contoh dari delegasi dan BeginInvoke() dan EndInvoke() metode:
// 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) ;
				
Ada empat cara umum untuk menggunakan BeginInvoke() dan EndInvoke() untuk membuat panggilan asynchronous. Setelah Anda memanggil BeginInvoke()Kamu bisa:
  • Opsional melakukan beberapa pekerjaan dan kemudian menggunakan EndInvoke().
  • Memperoleh WaitHandle yang disediakan oleh IAsyncResult objek, menggunakan yang WaitOne metode untuk memblokir sampai WaitHandle ditandai, dan kemudian memanggil EndInvoke().
  • Jajak pendapat IAsyncResult objek untuk menentukan ketika panggilan asynchronous selesai, dan maka panggilan EndInvoke().
  • Memiliki sistem memanggil fungsi panggilan balik yang Anda tentukan. Fungsi callback ini panggilan EndInvoke() dan proses hasil Umpamakan panggilan ketika itu melengkapi.
Contoh kode berikut menunjukkan ini menyebut pola dan kontras dengan membuat panggilan sinkron dengan menggunakan fungsi berikut:
string LongRunningMethod (int iCallTime, out int iExecThread)
{
	Thread.Sleep (iCallTime) ;
	iExecThread = AppDomain.GetCurrentThreadId ();
	return "MyCallTime was " + iCallTime.ToString() ;
}

				
LongRunningMethod() mensimulasikan fungsi yang menjalankan untuk waktu lama dengan tidur. Itu kembali waktu tidur dan ID yang itu. Jika Anda panggilan itu asynchronously, Anda menemukan bahwa benang ID melaksanakan thread adalah berbeda dari kain panggilan.

Langkah pertama untuk menentukan delegasi yang membungkus fungsi:
delegate string MethodDelegate(int iCallTime, out int iExecThread)  ;
				

Contoh 1: Memanggil metode serentak

Contoh ini menunjukkan bagaimana memanggil LongRunningMethod() serempak dengan menggunakan MethodDelegate delegasi. Contoh lain kontras ini dengan membuat panggilan asynchronously.
  1. Mulai Microsoft Visual Studio.NET atau Microsoft Visual Studio 2005.
  2. Membuat proyek Visual C# konsol aplikasi baru bernama AsyncDemo.
  3. Menambahkan kelas bernama AsyncDemo yang didefinisikan sebagai berikut proyek di file .cs baru:
    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() ) );
    	}
    }
    					
    Kemudian, kelas ini menunjukkan bagaimana untuk membuat panggilan asynchronous. Pada awalnya, namun, hanya berisi DemoSyncCall() metode, yang menunjukkan bagaimana memanggil delegasi serempak.
  4. Tambahkan kode berikut dalam tubuh Utama fungsi yang secara otomatis menciptakan Visual Studio di Anda Proyek:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoSyncCall() ;
    }
    					
  5. Tekan CTRL + F5 untuk menjalankan aplikasi Anda.

Contoh 2: Memanggil metode Asynchronously dengan menggunakan EndInvoke() Pola panggilan

Dalam bagian ini, sampel memanggil metode sama asynchronously. Pola panggilan yang digunakan adalah untuk memanggil BeginInvoke, melakukan beberapa bekerja pada kain utama, dan kemudian memanggil EndInvoke(). Perhatikan bahwa EndInvoke() tidak kembali sampai panggilan asynchronous telah selesai. Ini panggilan pola berguna ketika Anda ingin memiliki panggilan benang bekerja di waktu sama panggilan asynchronous mengeksekusi. Memiliki pekerjaan yang terjadi di bersamaan dapat meningkatkan kinerja dari banyak aplikasi. Tugas umum untuk menjalankan asynchronously cara ini adalah operasi file atau jaringan.
  1. Menambahkan metode yang bernama DemoEndInvoke() untuk AsyncDemo kelas. The DemoEndInvoke fungsi menunjukkan bagaimana memanggil delegasi asynchronously.
    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. Mengedit kode sumber untuk Utama Jadi bahwa itu berisi kode berikut:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoEndInvoke() ;
    }
    					
  3. Tekan CTRL + F5 untuk menjalankan aplikasi Anda.

Contoh 3: Memanggil metode Asynchronously dan menggunakan WaitHandle untuk menunggu panggilan untuk menyelesaikan


Dalam bagian ini, sampel panggilan metode asynchronously dan menunggu WaitHandle sebelum panggilan EndInvoke(). The IAsyncResult yang dikembalikan oleh BeginInvoke() telah AsyncWaitHandle properti. Properti ini kembali WaitHandle yang ditandai ketika panggilan asynchronous selesai. Menunggu a WaitHandle adalah teknik sinkronisasi thread umum. Kain panggilan menunggu WaitHandle dengan menggunakan WaitOne() metode WaitHandle. WaitOne() blok sampai WaitHandle ditandai. Kapan WaitOne() kembali, Anda dapat melakukan beberapa pekerjaan tambahan sebelum memanggil EndInvoke(). Seperti pada contoh sebelumnya, teknik ini berguna untuk mengeksekusi file atau jaringan operasi yang blok lain panggilan utama benang.
  1. Menambahkan fungsi bernama DemoWaitHandle() untuk AsyncDemo kelas. The DemoWaitHandle() fungsi menunjukkan bagaimana memanggil delegasi asynchronously.
    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. Mengedit kode sumber untuk Utama Jadi bahwa itu berisi kode berikut:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoWaitHandle () ;
    }
    					
  3. Tekan CTRL + F5 untuk menjalankan aplikasi Anda.

Contoh 4: Memanggil metode Asynchronously dengan menggunakan pola Polling panggilan

Dalam bagian ini, sampel polling IAsyncResult objek untuk mengetahui ketika panggilan asynchronous telah selesai. The IAsyncResult obyek yang dikembalikan oleh BeginInvoke() telah IsCompleted properti yang kembali Benar Setelah panggilan asynchronous melengkapi. Anda kemudian dapat EndInvoke(). Pola panggilan ini sangat berguna jika Anda aplikasi sedang berlangsung bekerja bahwa Anda tidak ingin memiliki diblokir oleh panggilan fungsi berjalan lama. A Aplikasi Microsoft Windows adalah contoh ini. Benang utama Aplikasi Windows dapat terus menangani input pengguna sementara asynchronous panggilan mengeksekusi. Dapat secara berkala memeriksa IsCompleted untuk melihat jika panggilan telah selesai. It panggilan EndInvoke Kapan IsCompleted kembali Benar. Karena EndInvoke() blok sampai operasi asynchronous selesai, aplikasi tidak menyebutnya sampai itu tahu bahwa operasi lengkap.
  1. Menambahkan fungsi bernama DemoPolling() untuk AsyncDemo kelas. The DemoPolling() fungsi menunjukkan bagaimana memanggil delegasi asynchronously dan menggunakan pemungutan suara untuk melihat apakah proses lengkap.
    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. Mengedit kode sumber untuk Utama. Mengganti konten fungsi dengan kode berikut:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoPolling () ;
    }
    					
  3. Tekan CTRL + F5 untuk menjalankan aplikasi Anda.

Contoh 5: Mengeksekusi Callback ketika metode Asynchronous selesai

Dalam bagian ini, sampel menyediakan callback delegasi untuk BeginInvoke() fungsi sistem mengeksekusi ketika panggilan asynchronous melengkapi. Panggilan panggilan balik EndInvoke() dan proses hasil panggilan asynchronous. Panggilan ini pola berguna jika kain yang memulai panggilan asynchronous tidak perlu untuk memproses hasil panggilan. Sistem memanggil panggilan balik pada Thread Selain benang melakukan ketika panggilan asynchronous selesai.

Untuk menggunakan pola panggilan ini, Anda harus lulus delegasi jenis AsyncCallback sebagai parameter kedua-untuk-terakhir BeginInvoke() fungsi. BeginInvoke() juga memiliki parameter akhir jenis objek di mana Anda dapat melewati setiap objek. Objek ini tersedia untuk fungsi panggilan balik Anda ketika itu dipanggil. Satu penggunaan yang penting untuk parameter ini adalah untuk lulus delegasi yang digunakan untuk memulai panggilan. Panggil balik fungsi dapat menggunakan EndInvoke() fungsi yang delegasi untuk menyelesaikan panggilan. Pola panggilan ini ditunjukkan di bawah ini.
  1. Menambahkan dua metode yang bernama DemoCallback() dan MyAsyncCallback() untuk AsyncDemo kelas. The DemoCallback() metode menunjukkan bagaimana memanggil delegasi asynchronously. Itu menggunakan delegasi untuk membungkus MyAsyncCallback() metode yang sistem panggilan ketika operasi asynchronous melengkapi. MyAsyncCallback() panggilan 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. Mengedit kode sumber untuk Utama. Mengganti konten fungsi dengan kode berikut:
    static void Main(string[] args)
    {
    	AsyncDemo ad = new AsyncDemo () ;
    	ad.DemoCallback() ;
    }
    					
  3. Tekan CTRL + F5 untuk menjalankan aplikasi Anda.

Properti

ID Artikel: 315582 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
Kata kunci: 
kbhowtomaster kbmt KB315582 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:315582

Berikan Masukan

 

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