Yukarıdaki kodla karşılaştırıldığında for class RulyCanceler, kodu CancellationTokenSource
kullanarak çalıştırmak istedim.CancellationToken özelliği nasıl kullanılır?
Cancellation Tokens numaralı belgede belirtildiği gibi, yani bir istisna atmadan/yakalamadan nasıl kullanabilirim? IsCancellationRequested
özelliğini kullanabilir miyim?
cancelToken.ThrowIfCancellationRequested();
ve
try
{
new Thread(() => Work(cancelSource.Token)).Start();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
ancak bu yöntemin Work(CancellationToken cancelToken)
yılında cancelToken.ThrowIfCancellationRequested();
bir çalışma zamanı hata verdi:
System.OperationCanceledException was unhandled
Message=The operation was canceled.
Source=mscorlib
StackTrace:
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33
at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
kodu başarıyla koştum OperationCanceledException th içinde yakalandı E yeni iplik şu şekildedir:
using System;
using System.Threading;
namespace _7CancellationTokens
{
internal class Token
{
private static void Main()
{
var cancelSource = new CancellationTokenSource();
new Thread(() =>
{
try
{
Work(cancelSource.Token); //).Start();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
}).Start();
Thread.Sleep(1000);
cancelSource.Cancel(); // Safely cancel worker.
Console.ReadLine();
}
private static void Work(CancellationToken cancelToken)
{
while (true)
{
Console.Write("345");
cancelToken.ThrowIfCancellationRequested();
}
}
}
}
teşekkürler! Bu online metin, oldukça yetkili ("Nutshell" C# 4.0 "kitap?) Takip etmiyor. Bana "her zaman" hakkında bir referans verebilir misin? – Fulproof
Bu, pratikten ve deneyimden gelir =). Bunu nereden bildiğimi hatırlayamıyorum. "Her zaman ihtiyacın var" demiştim, çünkü Thread.Abort() 'ı kullanarak dışarıdan bir istisna dışında iş parçacığı parçasını kesebilirsin, ama bu çok kötü bir uygulama. Bu arada, CancellationToken.ThrowIfCancellationRequested() kullanarak da "bunu kendi başına iptal et", sadece bunu yapmak için başka bir yoldur. –
^bu doğru. Bunun yerine "if" bloğu yerine "cancelToken.ThrowIfCancellationRequested();" Bazen belgeler/kitaplar kapalı (MVP'ler tarafından yazıldığı zaman bile) - bu talihsiz bir durumdur, ancak belki bir sonraki baskıda düzeltilecektir. Bu arada, belki de kitabın çevrimiçi bir errata sitesi olup olmadığını kontrol edebilirsiniz (ve eğer bir hata belirtilmemişse, belki de bulgularınızı gelecekteki düzeltmeler için yazara gönderebilirsiniz). – BrainSlugs83