【发布时间】:2021-12-28 01:03:32
【问题描述】:
我在 C# 中实现了这样的多任务处理:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TasksAsyncAwait
{
class Program
{
static async Task Main(string[] args)
{
CancellationTokenSource cancellationTokenSource
= new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;
Task taskOne = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task 1 start");
for (int i = 0; i < 10; i++)
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine($"T1: {i}");
cancellationToken.WaitHandle.WaitOne(500);
}
Console.WriteLine("Task 1 complete");
}, cancellationToken);
Task taskTwo = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task 2 start");
for (int i = 0; i < 5; i++)
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine($"T2: {i}");
cancellationToken.WaitHandle.WaitOne(300);
}
Console.WriteLine("Task 2 complete");
}, cancellationToken);
Task.WaitAll(taskTwo, taskOne);
Console.WriteLine("Program done.");
}
}
}
有人告诉我,虽然代码运行良好且易于理解,但它已过时且已弃用,因此风格不佳,我需要重写此代码以遵循 async/await 方案。我读了很多关于如何使用 async/await 的文章,一些教程甚至涵盖了如何在控制台应用程序中使用它,但坦率地说,我一个字都不懂。请告诉我如何将我的代码转换为 async/await 样式。
【问题讨论】:
-
我投票决定用它的 "no actual problem to be solved" 来结束这个问题,听起来有点像 代码改进 和/或 review i> 如果是这样,那么对于 SO 来说可能是题外话。它可能更适合另一个 SE 站点,但请务必阅读相关的常见问题解答;和/或在交叉发布之前根据需要重新措辞您的问题。 How to Ask。祝你好运!
-
我读了你链接的内容,上面写着:“你应该只根据你面临的实际问题提出实际的、可回答的问题。”我的 Q 看起来非常适合我。
-
“我的 Q 看起来很适合我” - 你也说过 “
though the code works perfectly..., it was outdated ....bad style, and that I need to rewrite this code” -
@MickyD 你确定关于代码改进的问题在 StackOverflow 上是题外话吗?我不能问(例如)如何通过从
Hashtable切换到Dictionary<TKey,TValue>,或者从foreach循环到LINQ,或者从长if/else if语句到模式匹配来使我的代码现代化? no actual problem to be solved 是否暗示难以理解新技术是一个不应该处理的假问题? -
我已经投票决定重新开放。
标签: c# multithreading async-await task-parallel-library cancellation-token