Tag: cancellationtokensource

任务IsCanceled是假的,而我取消了

当我取消任务时,等待结果仍然为IsCanceled属性返回true。 似乎有些事情出了问题。 请指教。 这是代码: CancellationTokenSource _cancelLationToken = new CancellationTokenSource(); private async void Button_Click(object sender, EventArgs e) { _cancelLationToken = new CancellationTokenSource(); _cancelLationToken.Token.Register(theCallBack); var myTaskToWaitFor = Task.Factory.StartNew(() => WorkHard(_cancelLationToken.Token), _cancelLationToken.Token); await myTaskToWaitFor; int i=0; if(myTaskToWaitFor.IsCanceled) i = i; //breakpoint for debugging else i = i; //breakpoint for debugging <== always ends here… 🙁 } private void […]

如何使用CancellationToken取消任务?

所以我有这个代码: //CancelationToken CancellationTokenSource src = new CancellationTokenSource(); CancellationToken ct = src.Token; ct.Register(() => Console.WriteLine(“Abbruch des Tasks”)); //Task Task t = new Task(() => { System.Threading.Thread.Sleep(1000); if (ct.IsCancellationRequested) { try { //Throw ct.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine( “ThrowIfCancellationRequested() liefert eben eine Exception”); } } }, ct); //Run Task and Cancel t.Start(); src.CancelAfter(350); t.Wait(); // Get […]

默认(CancellationToken)如何具有相应的CancellationTokenSource

当我创建一个默认的CancellationToken我可以在调试器中看到CancellationToken有一个与之关联的CancellationTokenSource ,它存储在私有m_source字段中: 我想知道如何对于结构, default关键字“将返回结构的每个成员初始化为零或取决于它们是值还是引用类型”并且CancellationTokenSource是引用类型。 CancellationToken确实有2个构造函数设置这个字段然而它们是无关紧要的default(CancellationToken)不调用构造函数和new CancellationToken() (具有完全相同的行为)不调用构造函数因为结构不能有无参数构造函数( 还 )。

如何使用CancellationToken安全地取消任务并等待Task.WhenAll

我有一个框架,它创建一个CancellationTokenSource,配置CancelAfter,然后调用异步方法并传递令牌。 然后异步方法产生许多任务,将取消令牌传递给每个任务,然后等待任务集合。 这些任务都包含通过轮询IsCancellationRequested来优雅取消的逻辑。 我的问题是,如果我将CancellationToken传递给Task.Run(),则抛出包含TaskCanceledException的AggregateException。 这可以防止任务正常取消。 为了解决这个问题,我无法将CancelationToken传递给Task.Run,​​但是我不确定我会丢失什么。 例如,我喜欢这样的想法,即如果我的任务挂起并且无法执行优雅取消,则此exception将强制关闭。 我以为我可以用两个CancelationTokens来处理这个问题,一个’优雅’而另一个’powershell’。 但是,我不喜欢这个解决方案。 这是一些psudo代码代表我上面描述的.. public async Task Main() { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(30000); await this.Run(cts.Token); } public async Task Run(CancellationToken cancelationToken) { HashSet tasks = new HashSet(); foreach (var work in this.GetWorkNotPictured) { // Here is where I could pass the Token, // however If I do […]

ThrowIfCancellationRequested似乎没有抛出任何exception

我有以下代码: CancellationTokenSource cts = new CancellationTokenSource(); ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; Task.Factory.StartNew(() => { if (Console.ReadKey().KeyChar == ‘c’) cts.Cancel(); Console.WriteLine(“press any key to exit”); }); Parallel.ForEach(list, po, (algo) => { algo.Compute(); // this compute lasts 1 minute Console.WriteLine(“this job is finished”); po.CancellationToken.ThrowIfCancellationRequested(); }); 该list包含很少的元素。 当我按’c’时,所有的Compute方法都已经启动了。 当我按’c’时,不会抛出任何exception。 每个Compute方法都会继续执行,直到正常结束。 当我按’c’时,我想停止/杀死所有剩余的Compute方法。

按时间取消任务

我有一个multithreading应用程序,我需要在一定时间后取消每个任务,即使在取消时,他们使用非托管资源。 现在我使用以下代码(例如,控制台应用程序)。 在实际应用中,延迟可能发生在非托管资源中。 static void Main() { for (int i = 0; i < 10; i++) { Task.Factory.StartNew(Do, TaskCreationOptions.LongRunning); } Console.ReadLine(); } private static void Do() { new Timer(Thread.CurrentThread.Abort, null, 1000, -1); try { Console.WriteLine("Start " + Task.CurrentId); Thread.Sleep(2000); Console.WriteLine("End " + Task.CurrentId); } catch (Exception) { Console.WriteLine("Thread Aborted " + Task.CurrentId); } } 得到结果: […]

与CancellationTokenSource的Task.Factory.FromAsync

我有以下代码行用于从NetworkStream异步读取: int bytesRead = await Task.Factory.FromAsync(this.stream.BeginRead, this.stream.EndRead, buffer, 0, buffer.Length, null); 我想支持取消。 我看到我可以使用CancellationTokenSource取消任务 ,但是我没有看到任何方法可以将它传递给TaskFactory.FromAsync() 。 是否可以使FromAsync()构造的任务支持取消? 编辑:我想取消已经运行的任务。

正确取消异步操作并再次触发

如何处理用户可能点击按钮的情况,该按钮多次调用长时间运行的异步操作。 我的想法是首先检查异步操作是否正在运行,取消它并再次触发它。 到目前为止,我已尝试使用CancellationTokenSource构建此类function,但它没有按预期工作。 有时会运行两个异步操作,因此当我启动新的操作时,“旧的”异步操作不会被取消,这会混合处理结果。 任何建议或例子如何处理这种情况? public async void Draw() { bool result = false; if (this.cts == null) { this.cts = new CancellationTokenSource(); try { result = await this.DrawContent(this.TimePeriod, this.cts.Token); } catch (Exception ex) {} finally { this.cts = null; } } else { this.cts.Cancel(); this.cts = new CancellationTokenSource(); try { result = await this.DrawContent(this.TimePeriod, […]

是否在任务取消正确时处理CancellationTokenSource的代码?

我在我面前看到这个代码,我很怀疑: CancellationTokenSource _cts; public void Dispose(); { _cts.Cancel(); _cts.Dispose(); _task.Wait(); //wait for the task to be canceled!? } 取消后直接调用_cts.Dispose()是否安全? 如果想要这样做,是否会取消取消任务所需的CancellationTokenSource的底层资源以成功等待CancellationToken?

为什么在取消大量HTTP请求时取消会阻塞这么长时间?

背景 我有一些代码使用来自一个特定主机的内容执行批量HTML页面处理。 它尝试使用HttpClient创建大量(~400)的同步HTTP请求。 我相信ServicePointManager.DefaultConnectionLimit限制了最大并发连接数,所以我没有应用自己的并发限制。 使用Task.WhenAll将所有请求异步发送到HttpClient Task.WhenAll ,可以使用CancellationTokenSource和CancellationToken取消整个批处理操作。 可以通过用户界面查看操作的进度,并且可以单击按钮以执行取消。 问题 对CancellationTokenSource.Cancel()的调用会阻塞大约5到30秒。 这会导致用户界面冻结。 怀疑是因为该方法正在调用注册取消通知的代码。 我考虑过什么 限制同时HTTP请求任务的数量。 我认为这是一种解决方法,因为HttpClient似乎已经HttpClient了过多的请求本身。 在非UI线程中执行CancellationTokenSource.Cancel()方法调用。 这不太好用; 在大多数其他任务完成之前,任务实际上并未运行。 我认为该方法的async版本可以很好地工作,但我找不到一个。 另外,我的印象是它适合在UI线程中使用该方法。 示范 码 class Program { private const int desiredNumberOfConnections = 418; static void Main(string[] args) { ManyHttpRequestsTest().Wait(); Console.WriteLine(“Finished.”); Console.ReadKey(); } private static async Task ManyHttpRequestsTest() { using (var client = new HttpClient()) using (var cancellationTokenSource […]