CancellationTokenSource
'umun Cancel()
yöntemini çağırarak, async yöntemimi aşağıdaki içerikle iptal ettiğimde, sonunda duracaktır. Ancak, Console.WriteLine(await reader.ReadLineAsync());
hattının tamamlanması biraz uzun sürdüğü için, Cancel()
çağrıma daha hızlı yanıt verebilmek için CancellationToken'i ReadLineAsync()
'a (boş bir dizge döndürmesini bekleyerek) geçirmeyi denedim. Ancak CancellationToken
'u ReadLineAsync()
'a geçiremedim.StreamReader.ReadLineAsync'i CancellationToken ile iptal edebilir miyim?
Bir aramayı Console.WriteLine()
veya Streamreader.ReadLineAsync()
iptal edebilir miyim, eğer öyleyse, nasıl yapabilirim?
Neden ReadLineAsync()
CancellationToken
kabul edilmiyor? Yöntemin iptal edildikten sonra hala tamamlanmasına rağmen, Async yöntemlerine isteğe bağlı bir CancellationToken
parametresi vermenin iyi bir uygulama olduğunu düşündüm.
StreamReader reader = new StreamReader(dataStream);
while (!reader.EndOfStream)
{
if (ct.IsCancellationRequested){
ct.ThrowIfCancellationRequested();
break;
}
else
{
Console.WriteLine(await reader.ReadLineAsync());
}
}
Güncelleme aşağıdaki yorum belirtilen gibi Console.WriteLine()
çağrı yalnız zaten satıra 40.000 karakterlik bir kötü formated giriş dizesi nedeniyle birkaç saniye kadar alıyordu. Bunu aşmak yanıt-zaman meselelerini çözer, ancak bir sebepten dolayı 40.000 karakterin bir satırda yazılması istendiğinde (örneğin tüm dizeyi içine dökerken) bu uzun süreli ifadeyi nasıl iptal edeceğime dair herhangi bir öneri veya geçici çözümle ilgileniyorum. bir dosya).
bakınız. Aşırı derecede kullanıcı-düşmanca bir program yazmışsınızdır, bu, kullanıcı tarafından okunandan çok daha yüksek bir hızda ekran boyunca cılızca kaydırma metni. Şimdi "bu saçmalıkları durdur" çözümünü arıyorsun. Tabii ki, sizin de kullanıcınız da öyle. Ama bu gerçek bir çözüm değil, doğru olanı asla başlamaz. Bir dosyaya yazın, Not Defteri ile görüntüleyin. Her şey daha iyi. –
'Yanlış sorunu çözmeye çalışıyorsunuz.” Bu açık olduğunuz için teşekkür ederim - kesinlikle haklısınız. –