Jika Anda ingin mempelajari teknologi halaman asinkron Asp.Net2.0, Anda harus membaca http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true dengan cermat, dan mengunduh kode sumbernya dan mempelajarinya dengan cermat. Teks lengkapnya memperkenalkan total 3 model pemrograman untuk mengimplementasikan halaman asinkron, dan masing-masing memiliki fungsi yang lebih canggih dibandingkan yang lain. Saya tidak akan mengatakan lebih banyak lagi, mari kita lihat model terakhir: gunakan kelas PageAsyncTask, metode RegisterAsyncTask, metode ExecuteRegisteredAsyncTasks, dan metode TimeoutAsyncOperation untuk mendaftar dan menjalankan tugas asinkron, dan memanggil metode pemrosesan batas waktu untuk waktu yang lama tanpa respons. File AsyncPageTask.aspx.cs dari kode sumber yang disediakan di artikel asli memberikan contoh mendetail tentang cara menggunakan model ini untuk mengimplementasikan halaman asinkron.
Keuntungan terbesar dari model ini adalah model ini dapat menangani beberapa tugas asinkron dalam satu permintaan halaman, dan pemrosesan batas waktu juga dapat digunakan untuk menghindari tidak responsif saat melakukan operasi asinkron. Penulis asli hanya mendaftarkan tugas asinkron di Page_Load, jadi kami mengikuti contohnya dan mendaftarkan tugas asinkron lainnya, seperti yang ditunjukkan di bawah ini:
<%@ Halaman Async="true" AsyncTimeout="5" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AsyncPageTask.aspx.cs" Inherits="AsyncPageTask" Title=" Halaman Tanpa Judul" %>
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
jika (!IsPostBack)
{
Tugas PageAsyncTask = PageAsyncTask baru(
BeginEventHandler baru (BeginAsyncOperation),
EndEventHandler baru (Operasi EndAsync),
EndEventHandler baru (TimeoutAsyncOperation),
batal
);
tugas PageAsyncTask1 = PageAsyncTask baru(
BeginEventHandler baru (BeginAsyncOperation1),
EndEventHandler baru (EndAsyncOperation1),
EndEventHandler baru (TimeoutAsyncOperation1),
batal
);
DaftarAsyncTask(tugas);
DaftarAsyncTask(tugas1);
}
}
Jika hasil yang dikembalikan oleh tugas asinkron diperoleh dalam waktu yang ditentukan dari atribut halaman AsyncTimeout, halaman akan ditampilkan seperti yang kita harapkan. Namun apa jadinya jika Anda mengalami sedikit masalah saat menjalankan tugas pertama dan kehilangan waktu? Ada dua kemungkinan: pertama, hasil tugas pertama akhirnya dikembalikan dan ditampilkan, dan tugas kedua dinilai telah habis waktunya segera setelah dimulai, sehingga menjalankan metode TimeoutAsyncOperation, kedua, tugas pertama tidak melakukannya telah dijatuhi hukuman timeout pada saat hasilnya dikembalikan, jadi tugas kedua juga harus sudah dijatuhi hukuman timeout. Situasi di atas disebabkan oleh dua tugas asinkron yang berbagi waktu yang ditentukan oleh AsyncTimeout. Selama tugas sebelumnya tertunda selama eksekusi, hal itu pasti akan mempengaruhi pengoperasian tugas berikutnya. Jadi bisakah dua tugas asinkron memiliki akses eksklusif ke waktu yang ditentukan oleh AsyncTimeout? Hal ini memerlukan pencarian cara melalui metode ExecuteRegisteredAsyncTasks.
Perlu dicatat bahwa Asp.net2.0 akan mengatur ulang properti AsyncTimeout setiap kali ExecuteRegisteredAsyncTasks dipanggil, yang berarti dimungkinkan untuk mencapai tugas asinkron yang eksklusif untuk waktu yang ditentukan oleh AsyncTimeout. Menurut cara penulisan program saat ini, jika metode ExecuteRegisteredAsyncTasks tidak dipanggil secara eksplisit, Asp.net2.0 akan memanggil PreRenderComplete dalam siklus hidup halaman.
Metode ExecuteRegisteredAsyncTasks secara otomatis dipanggil sebelum kejadian untuk menjalankan dua tugas asinkron yang terdaftar. Karena ExecuteRegisteredAsyncTasks hanya dijalankan sekali tetapi dua tugas dijalankan, kedua tugas tersebut harus berbagi waktu berjalan yang ditentukan oleh AsyncTimeout. Jadi saya membuat penyesuaian berikut pada kode:
protected void Page_Load(pengirim objek, EventArgs e)
{
jika (!IsPostBack)
{
Tugas PageAsyncTask = PageAsyncTask baru(
BeginEventHandler baru (BeginAsyncOperation),
EndEventHandler baru (Operasi EndAsync),
EndEventHandler baru (TimeoutAsyncOperation),
batal
);
tugas PageAsyncTask1 = PageAsyncTask baru(
BeginEventHandler baru (BeginAsyncOperation1),
EndEventHandler baru (EndAsyncOperation1),
EndEventHandler baru (TimeoutAsyncOperation1),
batal
);
DaftarAsyncTask(tugas);
ExecuteRegisteredAsyncTasks();
DaftarAsyncTask(tugas1);
ExecuteRegisteredAsyncTasks();
}
}
Pada pandangan pertama, sepertinya ada masalah: Apakah metode ExecuteRegisteredAsyncTasks kedua akan menjalankan kembali tugas asinkron pertama yang terdaftar? Sebenarnya tidak, karena Asp.net2.0 telah menetapkan bahwa metode asinkron yang sama hanya akan dijalankan satu kali. Oleh karena itu, dua tugas asinkron memiliki waktu berjalan eksklusif dan menghindari interferensi timbal balik.
http://www.cnblogs.com/taewind/archive/2006/12/22/600687.html