【问题标题】:How to know if a task completed synchronously?如何知道一个任务是否同步完成?
【发布时间】:2016-10-03 23:46:38
【问题描述】:

我依稀记得有一个属性告诉我们一个任务是否同步执行,但我刚才记不住了。或者可能没有,我将IAsyncResult.CompletedSynchronously 与这个混淆了?

【问题讨论】:

    标签: c# .net asynchronous async-await task-parallel-library


    【解决方案1】:

    检查这个:Task.IAsyncResult.CompletedSynchronously Property

    它的描述看起来很像答案:

    获取操作是否同步完成的指示。

    为了检查属性值,您必须将 Task 转换为 IAsyncResult,因为 Task 明确实现了它。

    bool? result = (myTask as IAsyncResult)?.CompletedSynchronously;
    

    您可以使用扩展方法代替显式转换:WindowsRuntimeSystemExtensions.AsAsyncOperation 定义在 System 命名空间中:

    bool result = myTask.AsAsyncOperation().CompletedSynchronously;
    

    正如评论中合理指出的那样,尽管当前property implementation 中有一个插科打诨。自 2016 年 10 月 1 日起,它始终返回 false。这可能会发生变化。

    【讨论】:

    • 不幸的是MSDN在这里误导了,该属性总是返回false:referencesource.microsoft.com/#mscorlib/system/threading/Tasks/…
    • @IvanDanilov 更新了答案,感谢您的澄清。
    • 所以基本上,没有办法知道任务是否同步运行。截至 2018 年 10 月,因为我仍然看到相同的“堵嘴”实现,它只是返回 false。难以置信。
    • @Triynko Task 是一种异步操作,我认为它并不意味着同步完成。这就是属性实现总是返回false 的原因。至于Task.RunSynchronously 方法,我认为它是如此奇特,以至于MS 家伙都不愿意过多关注它。由于 .NET 开发现在是开源的,但您始终可以提交问题。如果您真的有兴趣,可以去:github.com/dotnet/corefx
    • 任务是异步操作的抽象,它可能同步完成,也可能不同步完成。例如,Task.FromResult 不产生,并同步返回一个已完成的任务。要强制异步收益,您可以使用 Task.Yield。任务可能同步完成也可能不同步完成的事实是它具有称为 CompletedSynchronously 的属性的全部意义。它总是返回 false 的事实意味着您无法知道 Task 是否同步完成。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多