Arka planda çalışacak bir görevi tetiklemek istiyorum. Görevlerin tamamlanmasını beklemek istemiyorum.
.Net 3.5'te bunu yapardım:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
.Net 4'te TPL önerilen yoldur. Tavsiye ettiğim yaygın model şudur:
Task.Factory.StartNew(() => { DoSomething(); });
Bununla birlikte, StartNew()
yöntem , Task
uygulayan bir nesne döndürür IDisposable
. Bu, bu modeli öneren kişiler tarafından gözden kaçırılmış gibi görünüyor. Task.Dispose()
Yöntemle ilgili MSDN belgeleri şunları söylüyor:
"Göreve son başvurunuzu bırakmadan önce daima Dispose arayın."
Tamamlanana kadar bir görev için dispose çağıramazsınız, bu nedenle ana iş parçacığının wait and call dispose'a sahip olmak, ilk etapta bir arka plan iş parçacığı üzerinde yapma noktasını ortadan kaldırır. Ayrıca, temizleme için kullanılabilecek tamamlanmış / bitmiş herhangi bir olay görünmüyor.
Task sınıfındaki MSDN sayfası bu konuda yorum yapmaz ve "Pro C # 2010 ..." kitabı aynı kalıbı önerir ve görevlerin atılmasıyla ilgili yorum yapmaz.
Sadece bırakırsam, sonlandırıcı sonunda onu yakalayacağını biliyorum, ancak bu gibi çok fazla ateş ve unut görevi yaptığımda ve sonlandırıcı iş parçacığı boğulduğunda bu geri gelip beni ısıracak mı?
Yani sorularım:
- O demiyorlar için kabul edilebilir mi
Dispose()
üzerindekiTask
bu durumda sınıfın? Ve eğer öyleyse, neden ve riskler / sonuçlar var mı? - Bunu tartışan herhangi bir belge var mı?
- Yoksa
Task
kaçırdığım nesneyi elden çıkarmanın uygun bir yolu var mı? - Yoksa TPL ile ateş et ve unut görevlerini yapmanın başka bir yolu var mı?