c# - 正在返回什么任务,为什么这个任务状态是 RanToCompletion

标签 c# multithreading task

我对基于任务的编程相当陌生,并试图确定如何返回任务并验证它是否已启动。我开始工作的代码不是我所期望的。控制台应用程序如下:

public static void Main(string[] args)
    {
        var mySimple = new Simple();
        var cts = new CancellationTokenSource();
        var task = mySimple.RunSomethingAsync(cts.Token);
        while (task.Status != TaskStatus.RanToCompletion)
        {
            Console.WriteLine("Starting...");
            Thread.Sleep(100);
        }

        Console.WriteLine("It is started");
        Console.ReadKey();
        cts.Cancel();
    }

public class Simple
{
    public async void RunSomething(CancellationToken token)
    {
        var count = 0;
        while (true)
        {
            if (token.IsCancellationRequested)
            {
                break;
            }
            Console.WriteLine(count++);
            await Task.Delay(TimeSpan.FromMilliseconds(1000), token).ContinueWith(task => { });
        }
    }

    public Task RunSomethingAsync(CancellationToken token)
    {
        return Task.Run(() => this.RunSomething(token));
    }
}

输出是:

Starting...
0
It is started
1
2
3
4

为什么返回的任务的状态为 TaskStatus.RanToCompletion 而不是 TaskStatus.Running,因为我们看到 while 循环仍在执行?我是在检查将 RunSomething 任务放在线程池上的任务状态,而不是 RunSomething 任务本身吗?

最佳答案

RunSomething 是一个 async void 方法,这意味着它无法让调用者确定它何时完成,他们只能开始操作然后不知道接下来发生什么。然后将对它的调用包装在 Task.Run 中,这是安排一个线程池线程开始 RunSomething。一旦完成 starting Task,它将立即完成。

如果 RunSomething 实际上返回了一个 Task,那么调用者将能够确定它实际完成的时间,如果您等待它,它实际上不会指示它一直持续到异步操作实际完成(没有理由使用 Task.Run 在另一个 thead 中启动它,你最好直接调用它而不是浪费精力将其移动到线程池线程)。

关于c# - 正在返回什么任务,为什么这个任务状态是 RanToCompletion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41024528/

相关文章:

c# - C# 中的 Java WeakHashMap 类是否有等效项?

c# - MVC3 Controller 未接收任何参数值

multithreading - 信号量的初始值有什么意义?

c# - 在等待的任务上使用 ContinueWith() 并在内部调用 Task.Result

c# - 在循环中顺序执行函数而不阻塞ui

c# - 用括号外的逗号拆分值?

c# - 对象引用未设置为 Windows 8 应用程序中对象的实例

java - 迭代时向 HashSet 添加元素

c - Erlang 产生大量 C 进程

c# - 为什么这个任务挂起?