JoinableTaskContext Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Konteks umum di mana tugas yang dapat digabungkan dapat dibuat dan berinteraksi untuk menghindari kebuntuan.
public ref class JoinableTaskContext : IDisposable, Microsoft::VisualStudio::Threading::IHangReportContributor
public class JoinableTaskContext : IDisposable, Microsoft.VisualStudio.Threading.IHangReportContributor
type JoinableTaskContext = class
interface IHangReportContributor
interface IDisposable
Public Class JoinableTaskContext
Implements IDisposable, IHangReportContributor
- Warisan
-
JoinableTaskContext
- Penerapan
Keterangan
Ada tiga aturan yang harus diikuti secara ketat saat menggunakan atau berinteraksi dengan JoinableTasks: 1. Jika metode memiliki persyaratan apartemen utas tertentu (STA atau MTA) harus: a) Memiliki tanda tangan asinkron, dan secara asinkron marshal ke utas yang sesuai jika awalnya tidak dipanggil pada utas yang kompatibel. Cara yang disarankan untuk beralih ke utas utama adalah:
await JoinableTaskFactory.SwitchToMainThreadAsync();
b) Memiliki tanda tangan sinkron, dan melemparkan pengecualian ketika dipanggil pada utas yang salah. Secara khusus, tidak ada metode yang diizinkan untuk bekerja secara sinkron marshal ke utas lain (memblokir saat pekerjaan itu dilakukan). Blok sinkron secara umum harus dihindari jika memungkinkan. 2. Ketika implementasi API publik yang sudah dikirim harus memanggil kode asinkron dan memblokir untuk penyelesaiannya, ia harus melakukannya dengan mengikuti pola sederhana ini:
JoinableTaskFactory.Run(async delegate {
await SomeOperationAsync(...);
});
- Jika menunggu pekerjaan yang dimulai sebelumnya, pekerjaan itu harus Bergabung. Misalnya, satu layanan memulai beberapa pekerjaan asinkron yang nantinya dapat menjadi pemblokiran sinkron:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
await SomeOperationAsync(...);
});
Kemudian, pekerjaan asinkron menjadi pemblokiran:
longRunningAsyncWork.Join();
atau mungkin:
await longRunningAsyncWork;
Perhatikan bahwa langkah tambahan ini tidak diperlukan ketika menunggu dilakukan segera setelah memulai operasi asinkron.
Konstruktor
| Nama | Deskripsi |
|---|---|
| JoinableTaskContext() |
Menginisialisasi instans JoinableTaskContext baru kelas dengan asumsi utas saat ini adalah utas utama dan Current akan memberikan sarana untuk beralih ke utas utama dari utas lain. |
| JoinableTaskContext(Thread, SynchronizationContext) |
Menginisialisasi instans baru dari kelas JoinableTaskContext. |
Properti
| Nama | Deskripsi |
|---|---|
| Factory |
Mendapatkan pabrik yang membuat tugas yang dapat digabungkan yang bukan milik kumpulan tugas yang dapat digabungkan. |
| IsNoOpContext |
Mendapatkan nilai yang menunjukkan apakah instans ini tidak terkait dengan utas utama apa pun (misalnya dibuat dengan CreateNoOpContext()). |
| IsOnMainThread |
Mendapatkan nilai yang menunjukkan apakah penelepon menjalankan pada utas utama. |
| IsWithinJoinableTask |
Mendapatkan nilai yang menunjukkan apakah penelepon saat ini berjalan dalam konteks tugas yang dapat digabungkan. |
| MainThread |
Mendapatkan utas utama yang dapat dibagikan oleh tugas yang dibuat oleh konteks ini. |
| NoMessagePumpSynchronizationContext |
SynchronizationContext Mendapatkan yang, ketika diterapkan, menekan pompa pesan apa pun yang dapat berjalan selama blok sinkron dari utas panggilan. |
Metode
| Nama | Deskripsi |
|---|---|
| Capture() |
Mengambil konteks pemanggil dan menserialisasikannya sebagai string yang cocok untuk aplikasi melalui panggilan berikutnya ke RunAsync(Func<Task>, String, JoinableTaskCreationOptions). |
| CreateCollection() |
Membuat koleksi untuk tugas yang dapat bergabung dalam penerbangan. |
| CreateDefaultFactory() |
Membuat pabrik tanpa JoinableTaskCollection. |
| CreateFactory(JoinableTaskCollection) |
Membuat pabrik tugas yang dapat digabungkan yang secara otomatis menambahkan semua tugas yang dibuat ke koleksi yang dapat digabungkan bersama. |
| CreateNoOpContext() |
Menginisialisasi instans baru kelas yang dikonfigurasi JoinableTaskContext untuk no-op pada panggilan ke SwitchToMainThreadAsync(CancellationToken). |
| Dispose() |
Konteks umum di mana tugas yang dapat digabungkan dapat dibuat dan berinteraksi untuk menghindari kebuntuan. |
| Dispose(Boolean) |
Membuang sumber daya terkelola dan tidak terkelola yang dipegang oleh instans ini. |
| GetHangReport() |
Mengkontribusikan data untuk laporan macet. |
| IsMainThreadBlocked() |
Mendapatkan nilai yang menunjukkan apakah utas utama diblokir untuk penyelesaian penelepon. |
| IsMainThreadMaybeBlocked() |
Mendapatkan nilai yang sangat mungkin apakah utas utama diblokir untuk penyelesaian penelepon. Ini kurang akurat ketika tugas pemblokiran utas UI baru saja dimulai dan belum diblokir, atau rantai dependensi baru saja dihapus. Namun, tidak seperti IsMainThreadBlocked(), implementasi ini bebas kunci, dan lebih cepat dalam skenario pertikaian tinggi. |
| OnFalseHangDetected(TimeSpan, Guid) |
Dipanggil ketika laporan hang sebelumnya adalah alarm palsu. |
| OnHangDetected(TimeSpan, Int32, Guid) |
Dipanggil ketika hang diduga telah terjadi yang melibatkan utas utama. |
| SuppressRelevance() |
Menyembunyikan JoinableTask apa pun yang dikaitkan dengan pemanggil sampai nilai yang dikembalikan dibuang. |
Implementasi Antarmuka Eksplisit
| Nama | Deskripsi |
|---|---|
| IHangReportContributor.GetHangReport() |
Mengkontribusikan data untuk laporan macet. |
Berlaku untuk
Keamanan Thread
Jenis ini aman untuk semua anggota.