已知在wpf中有一个按钮,点击后执行一个task线程Vision(); 现要求再次点击该按钮后,中止这个task线程,如何实现
时间: 2024-12-23 19:22:59 浏览: 3
WPF中button按钮同时点击多次触发click解决方法
5星 · 资源好评率100%
在WPF中,要实现一个按钮点击后开始运行Task并在再次点击时能够停止,你可以使用`CancellationTokenSource`来管理异步操作的取消请求。这是一个简单的例子:
首先,在窗口(Window)类中添加一个`CancellationTokenSource`成员:
```csharp
public partial class MainWindow : Window
{
private CancellationTokenSource _cancellationTokenSource;
public MainWindow()
{
InitializeComponent();
}
// ...
}
```
然后,在`Vision()`方法中接受一个`CancellationToken`参数,并在需要的地方检查是否被取消:
```csharp
private async void Vision(CancellationToken cancellationToken)
{
try
{
for (int i = 0; !cancellationToken.IsCancellationRequested && i < 10; i++)
{
await Task.Delay(500, cancellationToken);
// 这里是你视觉处理的部分,比如显示进度或图片等
Debug.WriteLine($"Vision iteration {i}");
}
Console.WriteLine("Vision completed.");
}
catch (OperationCanceledException)
{
Console.WriteLine("Vision cancelled.");
}
}
// 在按钮的点击事件中调用Vision并传递CancellationToken
private async void Button_Click(object sender, RoutedEventArgs e)
{
if (_cancellationTokenSource == null)
{
_cancellationTokenSource = new CancellationTokenSource();
await Vision(_cancellationTokenSource.Token);
}
else
{
_cancellationTokenSource.Cancel();
_cancellationTokenSource.Dispose(); // 取消后记得关闭令牌源
// 等待当前任务完成
await Task.WhenAll(Task.Delay(100), Vision(_cancellationTokenSource.Token));
}
}
```
在这个例子中,当你第一次点击按钮时,会启动一个新的`Vision`任务。再次点击时,`_cancellationTokenSource.Cancel()`会被调用,这将中断`Vision`任务。同时,我们还等待了100毫秒确保任务完全结束,防止出现异常。
阅读全文