C#Task.Factory.Startnew开循环线程刷新chart
时间: 2023-12-21 21:05:39 浏览: 188
在C#中,可以使用`Task.Factory.StartNew`方法来启动一个后台线程,并使用`Invoke`方法在UI线程上更新`Chart`控件,以避免卡顿UI。以下是一个示例代码:
```csharp
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
class Program
{
static void 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 += (sender, e) =>
{
Task.Factory.StartNew(() =>
{
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;
}
}));
Task.Delay(1000).Wait(); // 每隔1秒钟执行一次循环
i++;
}
}, TaskCreationOptions.LongRunning);
};
Application.Run(form);
}
}
```
在这个示例中,我们创建了一个`Chart`控件,并在`Form`中显示它。在`Form`的`Load`事件处理程序中,我们使用`Task.Factory.StartNew`方法来启动一个后台线程,并在其中执行循环。在循环中,我们使用`Invoke`方法来在UI线程上更新`Chart`控件。我们还检查了`Chart`中点的数量,以便在添加新点后自动调整`Chart`的`AxisX`范围,以保持最近的10个点可见。最后,我们使用`Application.Run`方法来运行`Form`并显示`Chart`控件。
请注意,在使用`Invoke`方法时,必须将更新UI的代码封装在一个`Action`委托中,以便它可以在UI线程上执行。此外,我们使用了`TaskCreationOptions.LongRunning`选项来告诉.NET运行时,该任务将运行较长时间,并可能在后台线程上使用较多的资源。最后,我们在`Task.Delay`后面调用了`.Wait()`方法来确保在执行下一次循环之前等待1秒钟,以避免在后台线程上卡顿UI。
阅读全文