Bahasa

JoinableTaskContext Kelas

Definisi

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(...);
});
  1. 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.