C#Task开循环线程刷新chart不卡UI
时间: 2023-11-11 21:02:19 浏览: 98
在C#中,可以使用异步任务(`Task`)来在后台线程中执行循环,并使用`Invoke`方法在UI线程上更新`Chart`控件,以避免卡顿UI。以下是一个示例代码:
```csharp
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
class Program
{
static async Task Main(string[] args)
{
var chart = new Chart();
chart.Series.Add("Series1");
chart.ChartAreas.Add("ChartArea1");
chart.ChartAreas[0].AxisX.Minimum = 0;
chart.ChartAreas[0].AxisX.Maximum = 10;
chart.ChartAreas[0].AxisY.Minimum = 0;
chart.ChartAreas[0].AxisY.Maximum = 100;
var form = new Form();
form.Controls.Add(chart);
form.Load += async (sender, e) =>
{
await Task.Run(async () =>
{
var random = new Random();
var i = 0;
while (true)
{
var value = random.Next(0, 100);
chart.Invoke((Action)(() =>
{
chart.Series["Series1"].Points.AddXY(i, value);
if (chart.Series["Series1"].Points.Count > 10)
{
chart.ChartAreas[0].AxisX.Minimum = chart.Series["Series1"].Points[chart.Series["Series1"].Points.Count - 10].XValue;
chart.ChartAreas[0].AxisX.Maximum = chart.Series["Series1"].Points[chart.Series["Series1"].Points.Count - 1].XValue;
}
}));
await Task.Delay(1000); // 每隔1秒钟执行一次循环
i++;
}
});
};
Application.Run(form);
}
}
```
在这个示例中,我们创建了一个`Chart`控件,并在`Form`中显示它。在`Form`的`Load`事件处理程序中,我们使用异步任务来启动一个后台线程,并在其中执行循环。在循环中,我们使用`Invoke`方法来在UI线程上更新`Chart`控件。我们还检查了`Chart`中点的数量,以便在添加新点后自动调整`Chart`的`AxisX`范围,以保持最近的10个点可见。最后,我们使用`Application.Run`方法来运行`Form`并显示`Chart`控件。
请注意,在使用`Invoke`方法时,必须将更新UI的代码封装在一个`Action`委托中,以便它可以在UI线程上执行。此外,我们还使用了`async/await`模式来避免在后台线程上使用`Thread.Sleep`方法,以确保UI不会卡顿。
阅读全文