Tag: cancellation token

c#锁定并听取CancellationToken

我想使用锁或类似的同步来保护关键部分。 同时我想听一个CancellationToken。 现在我正在使用这样的互斥锁,但是互斥锁并没有那么好的性能。 我可以使用任何其他同步类(包括新的.Net 4.0)而不是互斥锁吗? WaitHandle.WaitAny(new[] { CancelToken.WaitHandle, _mutex}); CancelToken.ThrowIfCancellationRequested();

取消令牌的使用

我正在尝试学习如何使用取消令牌取消任务。 在这里,我已经为它编写了一个UnitTest,但我没有得到它的工作方式。 [TestMethod] public async Task Task_should_not_run_when_token_cancelled_before_its_call() { var cts = new CancellationTokenSource(); var token = cts.Token; cts.Cancel(); Debug.WriteLine(“Calling Cancellable Method”.ToUpper()); try { await CheckMeCalled(token); } catch (Exception expException) { } } private async Task CheckMeCalled(CancellationToken ct) { Debug.WriteLine(“Before task delayed”.ToUpper()); await Task.Delay(5000); Debug.WriteLine(“After task delayed”.ToUpper()); } 在上面的测试中,我在调用CheckMeCalled方法之前调用了CheckMeCalled cts.Cancel() 。 所以不应该取消它。 但它正在全力以赴。 我已经读到了某个地方 If Task […]

TaskCancellationException如何避免成功控制流程中的exception?

在我们的应用程序中,我们使用async / await和Tasks工作了很多。 因此它确实使用Task.Run很多,有时使用内置的CancellationToken取消支持。 public Task DoSomethingAsync(CancellationToken cancellationToken) { return Task.Run(() => { while (true) { if (cancellationToken.IsCancellationRequested) break; //do some work } }, cancellationToken); } 如果我现在使用CancellationToken取消执行,则执行会在下一个循环开始时停止,或者如果Task根本没有启动,则会抛出exception(Task.Run中的TaskCanceledException)。 现在的问题是为什么Task.Run使用Exception控制成功取消而不是仅返回已完成的Task。 是否有任何具体原因MS没有坚持“不要使用例外来控制执行流程”规则? 如何在一个完全无用的try catch(TaskCancelledException)块中避免使用Boxing支持取消(很多)的方法?

等待方法中的取消令牌

将令牌放在任务的构造函数中有很多理由,这里提到: Task构造函数中的取消令牌:为什么? 使用关键字,async / await,这是如何工作的? 例如我的代码如下: public async Task MethodAsync(CancellationToken token) { await Method01Async(); await Method02Async(); } 虽然它是一个异步过程。 我很快就使用了“Task.StartNext”或“Task.Run”或“new Task”。 为了能够指定我的取消令牌,我该怎么办?

为什么CancellationTokenRegistration存在,为什么它实现IDisposable

我一直看到在CancellationTokenRegistration结果中使用Cancellation.Register和using子句的代码: using (CancellationTokenRegistration ctr = token.Register(() => wc.CancelAsync())) { await wc.DownloadStringAsync(new Uri(“http://www.hamster.com”)); } 我明白你应该确保你Dispose一个IDisposable ,但为什么它甚至实现IDisposable ? 它必须释放什么资源? 它认为平等的唯一方法。 如果您不Dispose它会发生什么? 你泄漏了什么?

在Task.Run中使用CancellationToken超时不起作用

好的,我的问题非常简单。 为什么这段代码不会抛出TaskCancelledException ? static void Main() { var v = Task.Run(() => { Thread.Sleep(1000); return 10; }, new CancellationTokenSource(500).Token).Result; Console.WriteLine(v); // this outputs 10 – instead of throwing error. Console.Read(); } 但是这个有效 static void Main() { var v = Task.Run(() => { Thread.Sleep(1000); return 10; }, new CancellationToken(true).Token).Result; Console.WriteLine(v); // this one throws Console.Read(); }

GetResponseAsync不接受cancellationToken

似乎GetResponseAsync在Async / Await中不接受cancellationToken。 所以问题是我如何取消以下程序,只要我需要从响应中收集Cookie: using (HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync()) { cookies.Add(response.Cookies); } 实现上述目标的替代代码也是受欢迎的。