Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务的用途是什么。FromResult<;TResult>;在C中#_C#_.net_Task Parallel Library_Task_Async Await - Fatal编程技术网

C# 任务的用途是什么。FromResult<;TResult>;在C中#

C# 任务的用途是什么。FromResult<;TResult>;在C中#,c#,.net,task-parallel-library,task,async-await,C#,.net,Task Parallel Library,Task,Async Await,在C#和TPL()中,任务类表示生成T类型值的正在进行的工作 我想知道这种方法需要什么 也就是说:在一个场景中,您手头已经有了生成的价值,那么有什么必要将其包装回任务中呢 我唯一想到的是,它被用作接受任务实例的其他方法的适配器。一个例子是使用缓存的方法。如果已经计算了结果,则可以使用值返回已完成的任务(使用task.FromResult)。如果不是,则继续并返回代表正在进行的工作的任务 缓存示例:来自MSDN: 当执行返回任务对象的异步操作,并且该任务对象的结果已经计算出来时,此方法非常有用 我

在C#和TPL()中,
任务
类表示生成T类型值的正在进行的工作

我想知道这种方法需要什么

也就是说:在一个场景中,您手头已经有了生成的价值,那么有什么必要将其包装回任务中呢


我唯一想到的是,它被用作接受任务实例的其他方法的适配器。

一个例子是使用缓存的方法。如果已经计算了结果,则可以使用值返回已完成的任务(使用
task.FromResult
)。如果不是,则继续并返回代表正在进行的工作的任务

缓存示例:

来自MSDN:

当执行返回任务对象的异步操作,并且该任务对象的结果已经计算出来时,此方法非常有用


我发现了两种常见的用例:

  • 当您实现一个允许异步调用者的接口时,但您的实现是同步的
  • 当您为测试而存根/模拟异步代码时

  • 如果希望进行异步操作,但有时结果是同步的,请使用Task.FromResult。您可以在这里找到一个很好的示例。

    当您想要创建一个等待的方法而不使用async关键字时,可以使用它。 我发现这个例子:

    public class TextResult : IHttpActionResult
    {
        string _value;
        HttpRequestMessage _request;
    
        public TextResult(string value, HttpRequestMessage request)
        {
            _value = value;
            _request = request;
        }
        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(_value),
                RequestMessage = _request
            };
            return Task.FromResult(response);
        }
    }
    
    公共类TextResult:IHttpActionResult
    {
    字符串_值;
    HttpRequestMessage\u请求;
    公共文本结果(字符串值,HttpRequestMessage请求)
    {
    _价值=价值;
    _请求=请求;
    }
    公共任务执行同步(CancellationToken CancellationToken)
    {
    var response=newhttpresponsemessage()
    {
    内容=新的StringContent(_值),
    RequestMessage=\u请求
    };
    返回Task.FromResult(响应);
    }
    }
    

    在这里,您将创建自己的IHttpActionResult接口实现,用于Web Api操作。ExecuteAsync方法应该是异步的,但不必使用async关键字使其异步且可等待。由于您已经有了结果,不需要等待任何结果,因此最好使用Task.FromResult。

    我认为您可以将Task.FromResult用于同步的方法,这些方法需要很长时间才能完成,而您可以在代码中执行其他独立的工作。我宁愿让这些方法调用异步。但是想象一下这样的情况:您无法控制调用的代码,并且希望进行隐式并行处理。

    这对您有帮助吗?从某种程度上说,我同意这一点,但像这样创建密集、有用、整合、面向讨论的页面是一个巨大的好处。我几乎总是从一个好的、密集的stackoverflow页面中学到更多,而不是通过谷歌搜索和跨多个地方进行研究,所以在这种情况下,我真的很高兴他发布了这篇文章。我认为谷歌让我来到某某,请我去谷歌。它是一个循环引用:),可以缓存已完成的任务,例如从
    任务返回的任务。FromResult
    ,将整个任务对象保留在内存中似乎比只缓存结果浪费得多。除“值任务”外,其他任务都已缓存。我不记得具体是哪一个,但我认为缓存了
    Task.FromResult(0)
    Task.FromResult(1)
    Task.FromResult(false)
    Task.FromResult(true)
    。您不应该为网络访问缓存任务,但从结果中缓存任务是完全可以的。是否希望每次需要返回值时都创建一个值?。。。为了回答我自己的问题,任务缓存的好处是,其中一些可以是已完成的任务,而另一些可以是尚未完成的任务。呼叫者不必在意:他们进行异步调用,如果已经完成,他们会在等待时立即得到答案,如果没有,他们会在以后得到答案。如果没有这些缓存的任务,要么(a)需要两种不同的机制,一种是同步的,一种是异步的,这对调用方来说很麻烦,要么(b)每次调用方请求一个已经可用的答案时(如果我们只缓存了一个TResult),都必须动态创建一个任务。我现在明白了。答案的措辞有点混乱。任务本身没有内置的“缓存”机制。但是如果你写了一个缓存机制。。。说。。。。下载文件Task GetFileAync(),您可以通过使用Task.FromResult(cachedFile)立即返回缓存中已经存在的文件,等待将同步运行,通过不使用线程开关节省时间。#1的一个好例子是web服务。您可以有一个返回
    Task.FromResult
    的同步服务方法和一个异步等待网络I/O的客户端。这样,您可以使用
    ChannelFactory
    在客户端/服务器之间共享相同的接口。例如ChallengeAsync方法。WTF是微软的设计师在思考吗?此方法绝对没有理由返回任务。MS中的所有示例代码都只有FromResult(0)。希望编译器足够聪明,能够对其进行优化,并且不会产生一个新线程,然后立即杀死它@JohnHenckel:OWIN的设计从一开始就是异步友好的。接口和基类通常使用异步签名,因为它只允许(而不是强制)实现异步。因此,它类似于从
    IDisposable
    派生的
    IEnumerable
    ——它允许可枚举项拥有可支配资源,而不是强制它拥有可支配资源。无论是
    FromResult
    async
    ,还是
    Wait
    都不会产生线程。@StephenCleary-hmhm,感谢您的解释。我原以为等待会产生,但我试过了,我发现没有。只有Task.Run可以。因此,x=等待任务。FromResult(0);等于说x=0;那是c