C#Task开循环线程
时间: 2023-08-19 09:38:54 浏览: 164
您可以使用C#中的Task和while循环来创建一个循环线程。以下是一个示例代码:
```csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
await Task.Run(async () =>
{
while (true)
{
Console.WriteLine("Looping...");
await Task.Delay(1000); // 每隔1秒执行一次循环
}
});
}
}
```
在这个示例中,我们使用了Task.Run方法来启动一个新的线程,并在其中使用while循环来创建一个无限循环。在循环中,我们使用了Task.Delay方法来暂停1秒钟,然后继续执行下一次循环。您可以根据需要更改循环的条件和延迟的时间。
相关问题
C#Task开循环线程刷新chart不卡UI
在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不会卡顿。
c#Task.关闭线程
在 C# 中,我们可以使用 CancellationTokenSource 取消任务并关闭线程。以下是一个示例代码:
```csharp
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static CancellationTokenSource cts = new CancellationTokenSource();
static void Main(string[] args)
{
Task task = Task.Factory.StartNew(() =>
{
while (!cts.Token.IsCancellationRequested)
{
Console.WriteLine("Working...");
Thread.Sleep(1000);
}
}, cts.Token);
Console.WriteLine("Press any key to cancel the task and close the thread");
Console.ReadKey();
cts.Cancel();
task.Wait();
}
}
```
在这个示例中,我们创建了一个 Task 并在其中执行一个无限循环。在这个循环中,我们检查 CancellationTokenSource 是否已请求取消,如果没有,则继续工作。我们还将 CancellationTokenSource.Token 传递给 Task,以便 Task 可以检查是否请求了取消。
我们使用 Console.ReadKey() 等待用户按下任意键,然后我们调用 CancellationTokenSource.Cancel() 方法以请求取消任务并关闭线程。最后,我们使用 Task.Wait() 等待任务完成。
阅读全文