C#中的Task.Factory.Startnew 和 Task.Run

在C#中,Task.Factory.StartNew 和 Task.Run 都是用于在.NET Framework和.NET Core中启动新任务的方法。

Task.Factory.StartNew

Task.Factory.StartNew 方法是 TaskFactory 类的一个实例方法,用于创建一个新的 Task 实例并立即安排它执行。

这个方法提供了更多的配置选项,比如可以指定任务的创建选项(如任务的优先级、是否包含长时间运行的操作等)、任务调度器以及任务继续选项等。

使用场景

  • 当你需要精细控制任务的创建和执行时(比如指定任务的优先级或任务调度器)。
  • 当你需要在任务执行前后执行一些特定的逻辑时(可以使用 TaskCreationOptions 和 TaskContinuationOptions)。
Task task = Task.Factory.StartNew(() =>  
{  
    // 执行的任务代码  
}, TaskCreationOptions.LongRunning); // 指定这是一个长时间运行的任务

 

Task.Run

Task.Run 是一个更简洁、更推荐的方式来启动新任务。

它是 Task.Factory.StartNew 的一个简化版本,隐藏了大部分复杂的配置选项,使得代码更加简洁易读。

Task.Run 本质上也是调用 Task.Factory.StartNew,但使用了推荐的默认设置,这些设置对于大多数情况来说都是最优的。

使用场景

  • 当你需要简单地启动一个后台任务,而不关心具体的任务创建选项时。
  • 在异步编程中,当你需要将同步的代码块转换为异步执行时。
Task task = Task.Run(() =>  
{  
    // 执行的任务代码  
});

 

区别

  1. 简洁性Task.Run 比 Task.Factory.StartNew 更简洁,因为它隐藏了大多数不需要的配置选项。
  2. 默认行为Task.Run 使用推荐的默认行为(如使用默认的 TaskScheduler),而 Task.Factory.StartNew 允许你自定义这些行为。
  3. 性能:在大多数情况下,两者在性能上没有显著差异,但 Task.Run 由于其简洁性和默认的最佳实践,通常被认为是更好的选择。
  4. 推荐用法:随着.NET的发展,Task.Run 被广泛推荐用于启动新任务,因为它更简洁且默认行为更适合大多数场景。

        总结来说,Task.Run 是启动新任务的推荐方式,因为它既简洁又提供了合理的默认行为。然而,在某些需要精细控制任务行为的场景下,Task.Factory.StartNew 仍然是一个有用的选项。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值