C# 任务的用途是什么。FromResult<;TResult>;在C中#
在C#和TPL()中,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: 当执行返回任务对象的异步操作,并且该任务对象的结果已经计算出来时,此方法非常有用 我
任务
类表示生成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