在C#4.5及以下的Windows窗体应用程序编程中,使用Task和async关键字创建异步操作“精确地测量长时间运行任务的持续时间并 实时显示已执行时间”的完整示例代码。
时间: 2024-09-16 15:01:54 浏览: 66
在C# 4.5及以下版本中,由于缺乏`async`和`await`关键字(它们是在.NET框架4.5中引入的),我们可以使用古老的回调模式或者`BackgroundWorker`来实现实时显示长时间运行任务的进度。下面是一个使用`BackgroundWorker`的例子:
```csharp
using System;
using System.ComponentModel;
public partial class Form1 : Form
{
private BackgroundWorker worker = new BackgroundWorker();
private DateTime startTime;
public Form1()
{
InitializeComponent();
worker.DoWork += Worker_DoWork;
worker.ProgressChanged += Worker_ProgressChanged;
worker.WorkerReportsProgress = true;
}
private void buttonStart_Click(object sender, EventArgs e)
{
startTime = DateTime.Now;
worker.RunWorkerAsync("LongRunningTask");
}
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
// 长时间运行的任务
string taskName = (string)e.Argument;
Console.WriteLine($"开始执行 {taskName}...");
for (int i = 0; i < 100; i++)
{
// 模拟耗时操作
Thread.Sleep(100);
// 更新进度
if (worker.CancellationPending) break;
int progress = (i + 1) * 100 / 100;
worker.ReportProgress(progress);
}
Console.WriteLine($"{taskName} 执行完成.");
}
private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 显示实时执行时间
elapsedLabel.Text = $"已执行 {DateTime.Now - startTime}秒, 已完成 {e.ProgressPercentage}%";
}
private bool workerCancelled = false;
private void btnCancel_Click(object sender, EventArgs e)
{
worker.CancelAsync();
workerCancelled = true;
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (!workerCancelled && !worker.IsBusy)
{
worker.CancelAsync();
}
}
}
```
在这个例子中,我们创建了一个`BackgroundWorker`实例,当用户点击开始按钮时,它会启动一个名为`LongRunningTask`的模拟长时间任务,并在每次进度改变时更新UI。如果用户取消任务,我们会中断任务的执行。
注意:尽管这个例子展示了如何在旧版本中处理异步操作,但在实际项目中推荐升级到.NET Framework 4.5及以上,以便使用更现代的异步编程模型(`async`/`await`),其可读性和维护性更高。
阅读全文