Aracılığıyla paylaş


JoinableTaskContext Sınıf

Tanım

Kilitlenmeleri önlemek için birleştirilebilir görevlerin oluşturulabileceği ve etkileşime geçebileceği ortak bir bağlam.

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
Devralma
JoinableTaskContext
Uygulamalar

Açıklamalar

JoinableTasks kullanılırken veya bunlarla etkileşim kurarken kesinlikle uyulması gereken üç kural vardır: 1. Bir yöntemin belirli iş parçacığı dairesi gereksinimleri (STA veya MTA) varsa, şunlardan biri gerekir: a) Zaman uyumsuz bir imzaya sahip olmalı ve uyumlu bir iş parçacığında başlangıçta çağrılmazsa uygun iş parçacığına zaman uyumsuz olarak sıralanmalıdır. Ana iş parçacığına geçmenin önerilen yolu:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) Zaman uyumlu bir imzanız var ve yanlış iş parçacığında çağrıldığında bir özel durum oluştur. Özellikle, hiçbir yöntemin işi başka bir iş parçacığına zaman uyumlu olarak hazırlamasına izin verilmez (bu iş yapılırken engelleme). Genel olarak zaman uyumlu bloklardan mümkün olduğunca kaçınılmalıdır. 2. Zaten gönderilen bir genel API'nin bir uygulamasının tamamlanması için zaman uyumsuz kod ve blok çağırması gerektiğinde, bunu şu basit deseni izleyerek yapmalıdır:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Daha önce başlatılan çalışmayı bekliyorsanız, bu çalışma Katılmış olmalıdır. Örneğin, bir hizmet daha sonra zaman uyumlu olarak engelleyici hale gelebilecek bazı zaman uyumsuz işleri başlatır:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Daha sonra zaman uyumsuz çalışma engelleyici hale gelir:

longRunningAsyncWork.Join();

veya belki:

await longRunningAsyncWork;

Ancak, bekleme sırasında bu ek adımın zaman uyumsuz bir işlem başlatıldıktan hemen sonra yapıldığını unutmayın.

Oluşturucular

JoinableTaskContext()

Geçerli iş parçacığının JoinableTaskContext ana iş parçacığı olduğunu varsayarak sınıfın yeni bir örneğini başlatır ve Current başka bir iş parçacığından ana iş parçacığına geçiş yapma araçlarını sağlar.

JoinableTaskContext(Thread, SynchronizationContext)

JoinableTaskContext sınıfının yeni bir örneğini başlatır.

Özellikler

Factory

Birleştirilebilir görev koleksiyonuna ait olmayan birleştirilebilir görevler oluşturan fabrikayı alır.

IsOnMainThread

Çağıranın ana iş parçacığında yürütülüyor olup olmadığını belirten bir değer alır.

IsWithinJoinableTask

Çağıranın şu anda birleştirilebilir görev bağlamında çalışıp çalışmadığını belirten bir değer alır.

MainThread

Bu bağlam tarafından oluşturulan görevler tarafından paylaşılabilen ana iş parçacığını alır.

NoMessagePumpSynchronizationContext

Uygulandığında, çağıran iş parçacığının zaman uyumlu blokları sırasında çalışabilecek tüm ileti pompalarını bastıran bir SynchronizationContext alır.

Yöntemler

Capture()

Çağıranın bağlamını yakalar ve sonraki çağrısı RunAsync(Func<Task>, String, JoinableTaskCreationOptions)aracılığıyla uygulamaya uygun bir dize olarak serileştirir.

CreateCollection()

Uçuş içi birleştirilebilir görevler için bir koleksiyon oluşturur.

CreateDefaultFactory()

olmadan JoinableTaskCollectionbir fabrika oluşturur.

CreateFactory(JoinableTaskCollection)

Oluşturulan tüm görevleri otomatik olarak birleştirilebilen bir koleksiyona ekleyen birleştirilebilir görev fabrikası oluşturur.

Dispose()

Kilitlenmeleri önlemek için birleştirilebilir görevlerin oluşturulabileceği ve etkileşime geçebileceği ortak bir bağlam.

Dispose(Boolean)

Bu örnek tarafından tutulan yönetilen ve yönetilmeyen kaynakları atar.

GetHangReport()

Askıda kalma raporu için veri katkıda bulunur.

IsMainThreadBlocked()

Ana iş parçacığının çağıranın tamamlanması için engellenip engellenmediğini belirten bir değer alır.

IsMainThreadMaybeBlocked()

Ana iş parçacığının çağıranın tamamlanması için engellenip engellenmediğine ilişkin büyük olasılıkla bir değer alır. Ui iş parçacığı engelleme görevi yeni başladığında ve henüz engellenmediğinde veya bağımlılık zinciri yeni kaldırıldığında daha az doğru olur. Ancak, 'nin aksine IsMainThreadBlocked(), bu uygulama yüksek çekişme senaryolarında kilitsiz ve daha hızlıdır.

OnFalseHangDetected(TimeSpan, Guid)

Önceki bir askıda kalma raporu yanlış alarm olduğunda çağrılır.

OnHangDetected(TimeSpan, Int32, Guid)

Ana iş parçacığıyla ilgili bir kilitlenme oluştuğundan şüphelenildiğinde çağrılır.

SuppressRelevance()

Döndürülen değer atılana kadar çağıranın ilişkili olduğu JoinableTask değerlerini gizler.

Belirtik Arabirim Kullanımları

IHangReportContributor.GetHangReport()

Askıda kalma raporu için veri katkıda bulunur.

Şunlara uygulanır

İş Parçacığı Güvenliği

Bu tür, tüm üyeler için iş parçacığı açısından güvenlidir.