Wpf中需要执行一段循环,循环的内容为执行代码A,然后10s后执行代码b,然后5s后结束一次循环。现在需要点击button1开始这个循环,无论在循环执行的任何位置可以点击button2立即中断并停止循环
时间: 2024-12-22 17:28:28 浏览: 5
在WPF中,你可以使用`System.Threading.Tasks`库中的`Task`和`Timer`类来实现这样的功能。首先,你需要创建一个`Button`事件处理程序,用于启动循环和中断。这里是一个简单的示例:
```csharp
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
public partial class MainWindow : Window
{
private CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
private Task _timerTask;
public MainWindow()
{
InitializeComponent();
button1.Click += Button1_Click;
button2.Click += Button2_Click;
}
private async void Button1_Click(object sender, RoutedEventArgs e)
{
// 开始循环
_cancellationTokenSource.CancelAfter(6000); // 设置总时长为60秒(10s + 5s * 10次)
_timerTask = RunCycleAsync(_cancellationTokenSource.Token);
}
private async void Button2_Click(object sender, RoutedEventArgs e)
{
// 如果循环未完成,取消令牌
if (_cancellationTokenSource.IsCancellationRequested && _timerTask != null)
{
await _timerTask; // 等待当前任务完成
_timerTask = null;
}
}
private async Task RunCycleAsync(CancellationToken cancellationToken)
{
for (int i = 0; i < 10; i++)
{
try
{
Console.WriteLine("Executing code A...");
// 在这里执行代码A,可能需要替换为更复杂的逻辑
await Task.Delay(10000, cancellationToken); // 延迟10秒
Console.WriteLine("Executing code B...");
await Task.Delay(5000, cancellationToken); // 延迟5秒
}
catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
{
// 如果被取消,捕获异常并退出循环
break;
}
}
Console.WriteLine("Loop finished or interrupted.");
}
}
```
在这个例子中,当点击`button1`时,会启动一个计时器,最多运行60秒(10秒执行代码A,然后5秒执行代码B)。如果在此期间点击`button2`,则会取消计时器并停止当前循环。
阅读全文