实用教程 | 如何在JetBrains Rider中使用Tasks(任务)视图
进一步了解Rider或申请免费试用,欢迎咨询JetBrains授权合作伙伴-龙智。

System.Threading
和 System.Threading.Tasks
中的类型编写自定义代码。只有掌握并发和线程的基础,包括锁定、死锁、await 和计划,才能编写出快速且可扩缩的解决方案。要扩展对这些概念的理解,部分需要优秀的工具来协助呈现和分析任务执行的繁杂本质。.NET 应用程序中的任务执行
常用任务
async
和 await
关键字的任务。这些异步 API 位于 ASP.NET Core、MAUI 和 Entity Framework Core 中。许多开源项目也已转向异步优先 API 来支持开发者需求。
await BasicWork();
async Task BasicWork()
{
await Task.Delay(TimeSpan.FromSeconds(1));
Console.WriteLine("👋 Hello Tasks View!");
}
BasicWork
方法。可以使用新的 Tasks(任务)视图来确认这一点。在调试会话中,点击 Tasks(任务)标签页查看下表。


Active(有效):目前正在执行和运行。 Scheduled(已计划):任务已创建,但尚未执行。 Awaiting(等待):任务已经等待,但可能正在等待其他任务。 Blocked(阻塞):任务位于堆栈顶部,执行线程被阻塞(睡眠、等待锁等)。堆栈中还有一些更高级别的任务。 Deadlocked(死锁):任务正在争用资源,并且存在严重问题。
父任务
TaskCreationOptions.AttachedToParent
将新任务与包含任务绑定。
await ParentedTasks();
Task ParentedTasks()
{
// Parent task
var parentTask = Task.Factory.StartNew(() =>
{
Console.WriteLine("Parent task started.");
// Child task
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Child task started.");
Task.Delay(2000).Wait(); // Simulating some work
Console.WriteLine("Child task completed.");
}, TaskCreationOptions.AttachedToParent);
Console.WriteLine("Parent task doing some work.");
}, TaskCreationOptions.AttachedToParent);
// Wait for parent task to complete, which includes the children
parentTask.Wait();
Console.WriteLine("Parent task completed.");
return Task.CompletedTask;
}

Id
。这些标识符有助于跟踪当前流程中存在的任务。ParentedTasks
代码产生的两个异步逻辑堆栈,该代码使用类似于 Wait
的方法并返回 Task.CompletedTask
。
计划任务
await
一项任务时,您可以有效地将工作安排在未来的时间。这项工作可以在计划任务之后立即进行,也可以在执行其他计划任务之后进行。在下面的示例中,我们计划了几个任务并等待它们完成。
await ScheduledWork();async Task ScheduledWork()
{
Console.Write("Let's work...");
var tasks = Enumerable
.Range(1, 10)
.Select((i) => Task.Run(() => Console.Write(i)));
await Task.WhenAll(tasks);
}
Task.WhenAll
尝试执行所有提供的任务,所有任务都计划在未来执行。您可以在 Tasks(任务)视图中看到此信息。
Task.WhenAll
会创建异步逻辑堆栈,所有操作都可以在该堆栈下运行。

死锁
创造一个死锁, 一起来了解 Tasks(任务)视图如何帮助我们识别它。我们将计划两个任务,每个任务都尝试锁定相同的变量。
await Deadlock();
// This method will cause a deadlock
// proceed with caution, oOOoOOoOo! 👻
async Task Deadlock()
{
object one = new();
object two = new();
var timer = new System.Timers.Timer(
TimeSpan.FromSeconds(2)
) { Enabled = true, AutoReset = false };
timer.Elapsed += (_, _) =>
{
// only see this if we're deadlocked
Console.WriteLine("💀Deadlock");
};
await Task.WhenAll(Task.Run(() =>
{
Console.WriteLine("Getting lock for one.");
lock (one)
{
Thread.Sleep(1000);
Console.WriteLine("Getting lock two in first task.");
lock (two)
{
}
}
}), Task.Run(() =>
{
Console.WriteLine("Getting lock two in second task.");
lock (two)
{
Thread.Sleep(1000);
Console.WriteLine("Getting lock one in second task.");
lock (one)
{
}
}
}));
}



结论
关于 JetBrains Rider
官网:www.shdsd.com
电话:400-666-7732