Tag: 取消令牌

如何在Web请求上传输CancellationToken

我正在做一些关于通过WebAPI取消异步请求的研究, 最近我发现最新版本的WebApi(不是.NET-Core)支持取消令牌。 作为测试我写了这段代码。 [HttpGet] [Route(“LongRequest”)] public async Task VeryLongRequest(string Key, CancellationToken token) { for (int i = 0; i < 5; ++i) { if (false == token.IsCancellationRequested) { Thread.Sleep(5000); } else { Trace.WriteLine("Cancelled"); } } return "Complete"; } 当用户关闭窗口/刷新/或导航到新页面(不在SPA上)时,此代码有效,并且更新取消令牌。 因为HTTP请求是无状态的,取消映射如何回到请求? 我怎样才能从我的客户手动调用取消?

为什么TaskFactory.StartNew收到CancellationToken

可能重复: 任务构造函数中的取消令牌:为什么? 此方法接收CancellationToken: CancellationTokenSource cts = new CancellationTokenSource(4); var t = Task.Factory.StartNew(() => { // code }, cts.Token); 由于取消是合作的(实际工作代码需要观察取消令牌),将此作为参数传递给StartNew方法的目的是什么?

获取任务取消提示

我可以获取在任务操作执行期间传递给Task构造函数的CancellationToken 。 大多数样本看起来像这样: CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken token = cts.Token; Task myTask = Task.Factory.StartNew(() => { for (…) { token.ThrowIfCancellationRequested(); // Body of for loop. } }, token); 但是如果我的动作不是lambda而是放在其他类中的方法而且我没有直接访问token呢? 唯一的方法是将token作为状态传递吗?

将CancellationToken传递给Task Class构造函数有什么用?

下面是一个示例代码,它创建一个模拟长时间运行进程的新任务。任务没有太多关于取消function。我使用取消令牌来取消任务,代码对我来说运行正常。 CancellationTokenSource CTS= new CancellationTokenSource(); Task PTask = new Task(() => { while (true) { if (!CTS.Token.IsCancellationRequested) { Thread.Sleep(5000); } else{Console.WriteLine(“Thread Cancelled”);break;} } return true; }, CTS.Token, TaskCreationOptions.None); PTask.Start(); Console.WriteLine(“Hit Enter to cancel the Secondary thread you have started”); Console.ReadLine(); CTS.Cancel(); System.Console.WriteLine(PTask.Result); } } 但是我无法理解的是将令牌参数(CTS.Token)传递给任务构造函数。传递参数的实际用途是什么,即使我没有将令牌传递给构造函数也可以实际取消任务。 下面是一个稍微修改过的版本,没有令牌参数。 CancellationTokenSource CTS= new CancellationTokenSource(); Task PTask = new Task(() […]

如何取消正在运行的任务?

我想取消正在运行的任务(当用户按下转义键时)。 当我点击“转义”键时,Form_KeyDown运行但不取消任务! CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken token=new CancellationToken(); private async void Search_Button_ClickAsync(object sender, EventArgs e) { token = tokenSource.Token; await (Task.Factory.StartNew(() => { //…my program }, token)); private void Form_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { tokenSource.Cancel(); } }

我可以用CancellationToken取消StreamReader.ReadLineAsync吗?

当我通过调用CancellationTokenSource的Cancel()方法Cancel()具有以下内容的异步方法时,它将最终停止。 但是自从Console.WriteLine(await reader.ReadLineAsync());行Console.WriteLine(await reader.ReadLineAsync()); 需要花费很多时间来完成,我试图将我的CancellationToken传递给ReadLineAsync() (期望它返回一个空字符串),以使该方法对我的Cancel()调用更具响应性。 但是我无法将CancellationToken传递给ReadLineAsync() 。 我可以取消对Console.WriteLine()或Streamreader.ReadLineAsync()的调用,如果是,我该怎么办? 为什么ReadLineAsync()不接受CancellationToken ? 我认为给Async方法一个可选的CancellationToken参数是好的做法,即使该方法在被取消后仍然完成。 StreamReader reader = new StreamReader(dataStream); while (!reader.EndOfStream) { if (ct.IsCancellationRequested){ ct.ThrowIfCancellationRequested(); break; } else { Console.WriteLine(await reader.ReadLineAsync()); } } 更新如下面的评论中所述,由于每行40.000个字符的输入字符串格式不正确, Console.WriteLine()调用已经占用了几秒钟。 打破这个问题可以解决我的响应时间问题,但是我仍然对如何取消这个长时间运行的语句的任何建议或解决方法感兴趣,如果由于某种原因打算在一行中写入40.000个字符(例如将整个字符串转储到一份文件)。

CancellationToken取消不会破坏BlockingCollection

我有这样的取消令牌 static CancellationTokenSource TokenSource= new CancellationTokenSource(); 我有一个像这样的阻止集合 BlockingCollection items= new BlockingCollection(); var item = items.Take(TokenSource.Token); if(TokenSource.CancelPending) return; 我打电话的时候 TokenSource.Cancel(); Take不会像它应该的那样继续下去。 如果我使用带轮询的TryTake,令牌显示它被设置为已取消。

停止线程,ManualResetEvent,volatile boolean或cancellationToken

我在Windows服务中有一个Thread(STAThread),它执行大量工作。 重新启动Windows服务时,我想优雅地停止此线程。 我知道几种方法 一个不稳定的布尔值 ManualResetEvent的 的CancellationToken 据我所知,Thread.Abort是不行的…… 什么是最佳做法? 该工作是在另一个类中执行的,而不是启动线程的类,因此有必要在构造函数中引入cancellationToken参数,或者例如具有volatile变量。 但我无法弄清楚什么是最聪明的。 更新 为了澄清一点,我已经结束了一个我正在谈论的非常简单的例子。 如前所述,这是在Windows服务中完成的。 现在我正在考虑在循环中检查的volatile布尔值或者cancelToken ….我不能等待循环完成,如下所述它可能需要几分钟,使得服务器的系统管理员相信当服务需要重新启动时,服务有问题….我可以毫无问题地将循环中的所有工作都放在没有问题的情况下,但是我不能用Thread.Abort来做这件事它是“邪恶的”而且是COM调用接口,因此需要进行小的清理。 Class Scheduler{ private Thread apartmentThread; private Worker worker; void Scheduling(){ worker = new Worker(); apartmentThread = new Thread(Run); apartmentThread.SetApartmentState(ApartmentState.STA); apartmentThread.Start(); } private void Run() { while (!token.IsCancellationRequested) { Thread.Sleep(pollInterval * MillisecondsToSeconds); if (!token.IsCancellationRequested) { worker.DoWork(); } } } } Class […]

什么是TaskFactory.StartNew()中的“cancellationToken”用于?

http://msdn.microsoft.com/en-us/library/dd988458.aspx UPD : 所以,让我们讨论这篇文章: http : //msdn.microsoft.com/en-us/library/dd997396.aspx 我已经改变了一点代码: static void Main() { var tokenSource2 = new CancellationTokenSource(); CancellationToken ct = tokenSource2.Token; var task = Task.Factory.StartNew(() => { // Were we already canceled? ct.ThrowIfCancellationRequested(); bool moreToDo = true; Thread.Sleep(5000); while (moreToDo) { // Poll on this property if you have to do // other cleanup before […]