Tag: 取消

如何取消Stream.ReadAsync?

如果您没有输入任何输入,为什么下面的代码没有完成?为什么即使在取消令牌被取消后它仍然响应按下的键? // Set up a cancellation token var cancellationSource = new CancellationTokenSource(); // Cancel the cancellation token after a little bit of time Task.Run(async () => { await Task.Delay(TimeSpan.FromSeconds(2)); cancellationSource.Cancel(); Console.WriteLine(“Canceled the cancellation token”); }); // Wait for user input, or the cancellation token Task.Run(async () => { try { using (var input = Console.OpenStandardInput()) […]

BackgroundWorker取消

我在winforms应用程序中使用BackgroundWorker来执行在另一个类中执行的长时间运行的任务(执行数据库操作)。 由于所有工作都在另一个class级完成,因此取消并不那么简单。 我在另一个类( GenerateStats )中使用一个事件来在后台操作完成时更新进度。 我想取消操作做类似的事情。 我不能只在DoWork函数中调用cancellationPending ,因为该方法在完成之前永远不会看到它并且会破坏目的。 我希望取消function,而无需将BackgroundWorker传递给generateForSubject() 。 无论如何,这可以支持从GenerateStats类中的generateForSubject()方法取消。 这是操作执行的类的实例化: GenerateStats genStats = new GenerateStats(); 这是我的DoWork函数,它可以在调用其他类中的事件时调用ReportProgress方法。 它还从执行操作的其他类generateForSubject()调用该方法。 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; genStats.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage, pe.UserState); genStats.generateForSubject(); } 这是应该启动取消并运行CancelAsync()的按钮单击事件处理程序 private void btnStop_Click(object sender, EventArgs e) { if (backgroundWorker.IsBusy) { backgroundWorker.CancelAsync(); } } […]

取消对’HttpClient.SendAsync()’的调用

是否可以取消对HttpClient.SendAsync()的调用? 我发送的数据如下: var requestMessage = new HttpRequestMessage(HttpMethod.Post, “some url”); var multipartFormDataContent = new MultipartFormDataContent(); // … construction of the MultipartFormDataContent. It contains form data + picture file requestMessage.Content = multipartFormDataContent; var response = await client.SendAsync(requestMessage).ConfigureAwait(false); 此代码完美无缺,但我需要能够根据用户需求取消请求。 这可能吗? 我看到SendAsync的重载接受了CancellationToken但我不知道如何使用它。 我还知道一个名为IsCancellationRequested的属性,它指示请求是否已被取消。 但是如何实际取消请求?

如何取消MVVM WPF应用程序中的窗口关闭

如何在点击取消按钮(或右上角的X或Esc)后取消退出特定表格? WPF: 视图模型: public class MyViewModel : Screen { private CancelCommand cancelCommand; public CancelCommand CancelCommand { get { return cancelCommand; } } public MyViewModel() { cancelCommand = new CancelCommand(this); } } public class CancelCommand : ICommand { public CancelCommand(MyViewModel viewModel) { this.viewModel = viewModel; } public override void Execute(object parameter) { if (true) { // […]

取消’HttpClient’POST请求

我在Windows Phone 8应用程序上使用HttpClient.PostAsync()上传图像。 用户可以选择通过UI按钮取消此上传。 要取消POST请求,我设置了CancellationToken 。 但这不起作用。 在取消请求之后,我看到仍然看到我的代理中发生了上传,很明显该请求被忽略了。 我的代码: using (var content = new MultipartFormDataContent()) { var file = new StreamContent(stream); file .Headers.ContentDisposition = new ContentDispositionHeaderValue(“form-data”) { FileName = “filename.jpg”, }; file.Headers.ContentType = new MediaTypeHeaderValue(“image/jpeg”); content.Add(file); await httpclient.PostAsync(new Uri(“myurl”, UriKind.Absolute), content, cancellationToken); } 另请注意,我有CancellationTokenSource的CancellationToken 。 用户单击“取消”按钮后,将调用tokensource.Cancel() 。 此外,我的测试用例中的图像是1到2 MB(不是那么大)。 那么,有没有办法取消HttpClient POST请求?

异步方法中的exception未被捕获

以下代码不会捕获通过调用ct.ThrowIfCancellationRequested引发的ct.ThrowIfCancellationRequested 。 public partial class TitleWindow : Window, IAsyncInitialization { public Task Initialization{get; private set;} CancellationTokenSource cts; public TitleWindow() { InitializeComponent(); cts = new CancellationTokenSource(); } private void Window_Loaded(object sender, RoutedEventArgs e) { try { cts.Cancel(); Initialization = GetCancelExceptionAsync(cts.Token); } catch (OperationCanceledException) { Console.WriteLine(“Operation canceled!”); } } public async Task GetCancelExceptionAsync(CancellationToken ct) { await Task.Delay(1000); […]

具有取消能力的长时间运行模式

为了执行长时间运行(让它在此上下文中搜索)操作,我将加载逻辑放在TPL任务中,因此在后台线程上调用通用方法Search() 。 Search()操作可以足够长,因此我需要能够使用CancellationToken正确取消它。 但是Search()操作直到完成才返回,所以我必须做一些逻辑才能实现方便和(!)快速取消。 使用WaitHandle我可以实现这样的事情: private void StartSearch() // UI thread { CancellationTokenSource s = new CancellationTokenSource(); Task.Factory.StartNew(() => StartSearchInternal(s.Token), s.Token) } private void StartSearchInternal(CancellationToken token) // Main Background Thread { ManualResetEvent eHandle = new ManualResetEvent(false); Task.Factory.StartNew(() => Search(eHandle ), TaskScheduler.Default); WaitHandle.WaitAny(new [] { eHandle, token.WaitHandle }); token.ThrowIfCancellationRequested(); } private IEnumerable Search(ManualResetEvent e) // Another […]

取消长时间运行任务后如何正确清理

我创建了一个类,其目的是抽象出对队列的并发访问的控制。 该类被设计为在单个线程上实例化,由多个线程写入,然后从后续单个线程读取。 我在类中生成了一个长时间运行的任务,它将执行阻塞循环并在项成功出列时触发事件。 我的问题是:我执行取消长时间运行的任务并随后清理/重置CancellationTokenSource对象的正确用法吗? 理想情况下,我希望能够在保持可用性以添加到队列的同时停止并重新启动活动对象。 我用Peter Bromberg的文章作为基础: C#4.0中的生产者/消费者队列和BlockingCollection 代码如下: using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; namespace Test { public delegate void DeliverNextQueuedItemHandler(T item); public sealed class SOQueueManagerT { ConcurrentQueue _multiQueue; BlockingCollection _queue; CancellationTokenSource _canceller; Task _listener = null; public event DeliverNextQueuedItemHandler OnNextItem; public bool IsRunning { get; private set; } public int QueueSize […]

停止线程,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 […]

在TPL中中止长时间运行的任务

我们的应用程序使用TPL来序列化(可能)长时间运行的工作单元。 工作(任务)的创建是用户驱动的,可以随时取消。 为了拥有响应式用户界面,如果不再需要当前的工作,我们想放弃我们正在做的事情,并立即开始一项不同的任务。 任务排队等同于: private Task workQueue; private void DoWorkAsync (Action callback, CancellationToken token) { if (workQueue == null) { workQueue = Task.Factory.StartWork (() => DoWork(callback, token), token); } else { workQueue.ContinueWork(t => DoWork(callback, token), token); } } DoWork方法包含一个长时间运行的调用,因此它不像持续检查token.IsCancellationRequested的状态那样简单,如果/当检测到取消时, token.IsCancellationRequested 。 长时间运行的工作将阻止任务继续,直到它完成,即使任务被取消。 我已经提出了两个样本方法来解决这个问题,但我不相信这两种方法都是正确的。 我创建了简单的控制台应用程序来演示它们如何工 需要注意的重要一点是, 在原始任务完成之前会继续触发 。 尝试#1:内部任务 static void Main(string[] args) { CancellationTokenSource cts […]