【问题标题】:Tasks Async/Await ... don't get it [closed]任务异步/等待......不明白[关闭]
【发布时间】: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&lt;TKey,TValue&gt;,或者从foreach 循环到LINQ,或者从长if/else if 语句到模式匹配来使我的代码现代化? no actual problem to be solved 是否暗示难以理解新技术是一个不应该处理的假问题?
  • 我已经投票决定重新开放。

标签: c# multithreading async-await task-parallel-library cancellation-token


【解决方案1】:

你在这里:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace TasksAsyncAwait
{
    class Program
    {
        static async Task Main()
        {
            var cancellationTokenSource = new CancellationTokenSource();
            var cancellationToken = cancellationTokenSource.Token;

            Task taskOne = Task.Run(async () =>
            {
                Console.WriteLine("Task 1 start");
                for (int i = 0; i < 10; i++)
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    Console.WriteLine($"T1: {i}");
                    await Task.Delay(500, cancellationToken);
                }
                Console.WriteLine("Task 1 complete");
            }, cancellationToken);

            Task taskTwo = Task.Run(async () =>
            {
                Console.WriteLine("Task 2 start");
                for (int i = 0; i < 5; i++)
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    Console.WriteLine($"T2: {i}");
                    await Task.Delay(300, cancellationToken);
                }
                Console.WriteLine("Task 2 complete");
            }, cancellationToken);

            await Task.WhenAll(taskOne, taskTwo);
            Console.WriteLine("Program done.");
        }
    }
}

没有阻塞代码;到处异步等待!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2021-09-11
    • 2019-11-08
    • 2013-02-10
    • 2017-07-22
    相关资源
    最近更新 更多