Bagikan melalui


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 rangkaian tertentu (STA atau MTA), metode 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 selesai). Blok sinkron secara umum harus dihindari jika memungkinkan. 2. Ketika implementasi API publik yang sudah dikirim harus memanggil kode asinkron dan memblokir untuk penyelesaiannya, api harus melakukannya dengan mengikuti pola sederhana ini:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Jika pernah 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 kemudian pekerjaan asinkron menjadi pemblokiran:

longRunningAsyncWork.Join();

atau mungkin:

await longRunningAsyncWork;

Namun perhatikan bahwa langkah tambahan ini tidak diperlukan ketika menunggu dilakukan segera setelah memulai operasi asinkron.

Konstruktor

JoinableTaskContext()

Menginisialisasi instans JoinableTaskContext baru kelas dengan asumsi utas saat ini adalah utas utama dan Current akan menyediakan sarana untuk beralih ke utas utama dari utas lain.

JoinableTaskContext(Thread, SynchronizationContext)

Menginisialisasi instans baru kelas JoinableTaskContext.

Properti

Factory

Mendapatkan pabrik yang membuat tugas yang dapat digabungkan yang bukan milik kumpulan tugas yang dapat digabungkan.

IsOnMainThread

Mendapatkan nilai yang menunjukkan apakah penelepon mengeksekusi pada utas utama.

IsWithinJoinableTask

Mendapatkan nilai yang menunjukkan apakah pemanggil 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

Capture()

Mengambil konteks penelepon 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 secara bersamaan.

Dispose()

Konteks umum di mana tugas yang dapat digabungkan dapat dibuat dan berinteraksi untuk menghindari kebuntuan.

Dispose(Boolean)

Buang sumber daya terkelola dan tidak terkelola yang dipegang oleh instans ini.

GetHangReport()

Berkontribusi 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. 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 ketidakcocokan 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

IHangReportContributor.GetHangReport()

Berkontribusi data untuk laporan macet.

Berlaku untuk

Keamanan Thread

Jenis ini aman untuk semua anggota.