首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回的任务是什么?为什么此任务状态为RanToCompletion?

返回的任务是什么?为什么此任务状态为RanToCompletion?
EN

Stack Overflow用户
提问于 2016-12-07 18:16:54
回答 3查看 901关注 0票数 4

我对基于任务的编程非常陌生,我试图确定如何返回一个任务并验证它是否已经启动。我得到的代码不是我所期望的。控制台应用程序如下:

代码语言:javascript
运行
复制
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));
    }
}

产出如下:

代码语言:javascript
运行
复制
Starting...
0
It is started
1
2
3
4

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

EN

Stack Overflow用户

发布于 2016-12-07 18:52:35

  1. 不要使用异步空(https://msdn.microsoft.com/en-us/magazine/jj991977.aspx),而应该使用异步任务
  2. 如果需要从非异步(例如从静态void )调用异步方法,则应该执行如下操作: mySimple.RunSomethingAsync(cts.Token).GetAwaiter().GetResult(); 这将有效地使该方法成为一个同步调用。
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41024528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档