Pertanyaan Apa yang terjadi jika Anda menjalankan thread latar belakang untuk mengeksekusi tepat sebelum ASP.NET menyelesaikan pemrosesan halamannya?


apa yang akan terjadi jika saya memutar utas untuk menjalankan proses yang berjalan lama tepat sebelum siklus hidup halaman ASP.NET selesai? Akankah ASP.NET runtime membunuh utas? Bisakah ini menyebabkan perilaku tidak terdefinisi?

Berikut ini contoh kode, yang memutar utas latar belakang di acara Page_Load. Apakah ini hal yang aman untuk dilakukan?

protected void Page_Load(object sender, EventArgs e)
{
    Thread newThread = new Thread(new ThreadStart(SomeLongRunningMethod));
    newThread.IsBackground = true;
    newThread.Start();
}

private void SomeLongRunningMethod()
{
    // some long running process goes here...
}

5
2018-02-02 08:00


asal


Jawaban:


Saya telah melakukan beberapa percobaan dengan jenis kode yang sama dengan melakukan beberapa kali memakan logging dalam utas yang terpisah. Tampaknya bekerja dengan baik, tetapi saya belum mengujinya di lingkungan produksi.

Satu-satunya perbedaan antara kode Anda dan saya adalah bahwa saya menggunakan kolam ulir alih-alih menyiapkan utas baru.

Anda mungkin akan membuat salinan data permintaan dan informasi halaman lainnya untuk menghindari mereka dibuang tetapi terlepas dari itu saya pikir ini harus bekerja dengan baik.


1
2018-02-02 08:42



Saya telah melakukan beberapa konversi video / pemrosesan dengan ffmpeg pada film yang diunggah oleh pengguna di formulir web dan itu bekerja sempurna, bahkan jika utas itu butuh beberapa jam untuk diselesaikan! Sangat penting untuk diingat bahwa sulit untuk mengetahui status utas, sehingga penebangan dan penanganan kesalahan sangatlah penting.


1
2018-02-02 08:59



Seorang rekan baru-baru ini melakukan ini untuk beberapa ekspor data. Klien akan masuk ke panel kontrol (berbasis web) dan kemudian menekan beberapa tombol dan apa yang tidak dan kemudian file akan FTP'd off ke beberapa server mistik.

Ujung depan dilakukan dengan menggunakan ASP AJAX dan seperti @bang mengatakan, thread dijalankan dengan baik tetapi itu adalah kotoran mutlak untuk melacak.

AJAX digunakan untuk memperbarui baris kemajuan dan baris status di UI yang bagus dalam teori dan sementara set data hanya beberapa ratus baris. Tapi begitu kami mulai bekerja dengan dataset nyata (jutaan baris) seluruh UI terus membanjiri dengan kesalahan timeout. Pada titik ini Anda kehilangan kontak dengan utas latar belakang ...

Apakah masih berjalan? Apakah ekspor sudah selesai? Apa yang akan terjadi jika saya me-refresh halaman dan menekan tombol lagi? Akankah rumah pemenuhan mengirimkan dua produk kepada orang-orang?

Ini sedikit mimpi buruk. Saat ini dia menulis ulang untuk dijalankan sebagai aplikasi konsol yang dijadwalkan dengan penjadwal tugas windows yang terhubung ke tabel pekerjaan yang berisi rincian ekspor yang perlu dilakukan.

Jika ini tampak agak bodoh, Anda selalu bisa menulis proses jangka panjang Anda dengan sedikit server soket dan memiliki kode-belakang aspx Anda berkomunikasi dengan itu.


1
2018-02-02 17:52



Waspadai pengaturan daur ulang pekerja IIS karena ini masih dapat memengaruhi utas Anda setelah dimulai. Pastikan Anda menangkap pengecualian dan mencatatnya.


0
2018-02-02 08:43