Bu, .Net 4'te Görev API'si kullanılarak çalıştırılması gereken bir arka plan iş parçacığı için iyi bir tasarım mı? Tek endişem, bu görevi nasıl iptal edeceğimi görmek istiyorsak mı? Biliyorum ProgramEnding
'u true
'a ayarlayabilirim ancak Görev API'sinde CancellationToken
olduğunu biliyorum.Best Practice LongRunning Görev oluşturma
Bu yalnızca bir örnek kod örneğidir, böylece bir iş parçacığı bir koleksiyona eklenir ve bundan başka bir iş parçacığı çıkarılır. Bu program çalışırken iken sürekli çalışıyor olması gerekiyor olarak görev LongRunning olarak kurulduğundan
private void RemoveFromBlockingCollection()
{
while (!ProgramEnding)
{
foreach (var x in DataInQueue.GetConsumingEnumerable())
{
Console.WriteLine("Task={0}, obj={1}, Thread={2}"
, Task.CurrentId, x + " Removed"
, Thread.CurrentThread.ManagedThreadId);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
DataInQueue = new BlockingCollection<string>();
var t9 = Task.Factory.StartNew(RemoveFromBlockingCollection
, TaskCreationOptions.LongRunning);
for (int i = 0; i < 100; i++)
{
DataInQueue.Add(i.ToString());
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, i + " Added",
Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(100);
}
ProgramEnding = true;
}
GÜNCELLEME: ben hiç parçacığı getirmek DataInQueue.CompleteAdding ProgramEnding boolean kaldırıp kullanabilirsiniz bulduk son.
İş parçacığını canlı tutmak için bir boolean kullanılması en iyi uygulamadır veya API çağrısı var mı? Bir BlockingCollection üzerinde CompleteAdding yöntemini kullanabileceğimi buldum, ancak BlockingCollection kullanmıyorsam ve başka bir şey yapsam boole güvenilir olabilir mi? – Jon
Evet, işe yarayacaktı. Ya da yukarıda bahsettiğim CancellationToken kullanıyorsunuz. – Fischermaen
Ben sadece bir iş parçacığı tutmak için fikrinizi soruyordum iş parçacığı iptal etmek için kullanabilir miyim? – Jon