2015-02-11 29 views
5

Bazı asenkron işlemleri yapıyorum ve kullanıcı bunu isterse, bir async görevinin çalışmasını durdurmak için CancellationToken kullanmak istiyorum. Bunu yapmak için doğru işlemi durdurmak için doğru İpliği bulabildiğim bir Sözlüke sahip olmak iyi bir uygulamadır.İptal Jetonu kaynak örneği

public Dictionary<Thread, CancellationToken> CancellationTokenData; 

Böylece kullanıcı yanlış değilsem doğru davranması gerektiği bir operasyona iptal isterse: Ne şu anda bakıyorum şudur?

Bunu yapmanın en iyi yöntemleri nelerdir? Örneğin, kullanıcının, bir iş parçacığı {B} kullanılarak veritabanının içindeki bir {A} kümesinde çok uzun süreli bir işlem gerçekleştirdiğini varsayalım. Ardından, işlemi iptal eder ve gider ve başka bir iş parçacığındaki {A} ayarında başka uzun bir işlem kullanır. Geçerli CancellationToken için global bir değişken kullanmalı mıyım?

+0

Ne istediğinizi anladığımı anlayamıyorum ama iptaller gayet basit ve iş parçacığını takip etmek için hiçbir sebep yok. Bir CancellationTokenSource oluşturursunuz ve belirtecini uzun bir işleme, yani bir iptal belirtecini kabul eden herhangi bir yönteme geçirirsiniz. Istemci, 'kaynağını' iptal etmek için çağırır, kaynak belirteci gösterir, bunu izleyen herhangi bir * işlem * bu incelikle sonlanır. İş parçacığı değil, sonlanan işlem/yöntem. "Geçerli" belirteci yok, aynı belirteci birden çok işlem için geçirebilirsiniz –

+0

@PanagiotisKanavos Tamam, ancak bunu yapmak için yerel bir değişken kullanıyor musunuz? Yerel bir kullanıyorum, çok kısıtlı alıyorum ki yalnızca bunu arayabilirim Şu anki yöntem içinde ve eğer onu küresel bir değişken olarak kullanırsam, işler dağınık olabilir mi? Her biri için bir tane küresel olmalı mı? Umarım aynı yoldayız. – Hristo

+0

Sizi, iş parçacığı arasında bağımlılıklar olduğunu anlıyor musunuz? O zaman elbette onlar için aynı Jetonu kullanmalısınız - ve bir sözlük kullanmanın bir anlamı yok ... –

cevap

15

Genellikle, iptal edilebilen her işlem için bir tane CancellationTokenSource var. CancellationTokenSource işlemini, iptal işlemini bilmesi gereken herkese (cts.Cancel()) ve CancellationToken (cts.Token) iptal etmeye ihtiyaç duyan herkese iletirsiniz.

Bu soyutlama düzeyinde, ipleri durdurmazsınız; işlemleri durdur. Konu sadece uygulama detaylarıdır.

Bu nedenle, simgeleri iş parçacığına eşlemek için iyi bir fikir olduğunu düşünmüyorum. Görevler söz konusuysa, bu çok kötü bir fikir çünkü her görevin aslında yeni bir iş parçacığı üzerinde çalıştığı konusunda bir garanti yoktur.

+0

Okay iplikleri arasında hiçbir bağımlılık yok, bu yüzden genellikle nasıl iptal işlemini işlemle eşleştiriyorsunuz? – Hristo

+0

Örneğin, A işleminin yürütülmesini durdurmak istediğimi ve başka bir işlemden 10 iptali bulunan iptal etme belirtecine sahip olduğumu varsayalım. İptal belirtecine uygulanan işlemi bağlamak için doğru yaklaşım nedir? – Hristo

+0

@Chris yapmıyorsunuz, işte bu nokta. * Bu yöntemi bir parametreye * geçirirsiniz. Yöntemler, her bir döngü adımından sonra, ya da iptal olayı üzerine ne yapmak istediklerini yapmak için Cancel olayına bir olay işleyicisi eklerler. –