如何使用Task.FromResult?

Task.FromResult

字数:889字

预计阅读时间:3分钟

1.解释

官方定义:创建一个结果的、成功完成的Task<TResult>

public static System.Threading.Tasks.Task<TResult> FromResult<TResult> (TResult result);

可以看出,Task.FromResult( )方法接受一个TResult然后返回一个Task<TResult>

2.例子

使用 Task.FromResult方法检索缓存中保存的异步下载操作的结果。

Ex:

? 以下示例从Web下载字符串。它定义了DownloadStringAsync方法。此方法异步从Web下载字符串。此示例还使用ConcurrentDictionary <TKey,TValue>对象来缓存先前操作的结果。如果输入地址保存在此缓存中,则DownloadStringAsync使用FromResult方法生成一个Task <TResult>对象,该对象保存该地址的内容。否则,DownloadStringAsyncWeb下载文件并将结果添加到缓存中。

1.添加CachedDownloads类,并且定义方法

    class CachedDownloads
    {
        /// <summary>
        /// 将下载在操作的结果保存在线程安全集合cachedDownloads中
        /// </summary>
        static ConcurrentDictionary<string, string> cachedDownloads = new ConcurrentDictionary<string, string>();

        /// <summary>
        /// 以字符串的形式异步下载所请求的资源
        /// </summary>
        /// <param name="address">地址</param>
        /// <returns></returns>
        public static Task<string> DownloadStringAsync(string address)
        {
            //首先尝试从缓存中检索内容。
            string content;
            if (cachedDownloads.TryGetValue(address, out content))
            {
                return Task.FromResult<string>(content);
            }
            //如果结果不在缓存中,那么使用异步方法下载字符串,并将其添加到缓存中
            return Task.Run(async () =>
            {
                content = await new WebClient().DownloadStringTaskAsync(address);
                cachedDownloads.TryAdd(address, content);
                return content;
            });
        }
    }

? 该类定义了一个ConcurrentDictionary集合用以保存下载结果,并且定义了DownloadStringAsync接受一个字符串地址,该方法内首先尝试从缓存中检索内容,如果结果不在缓存中,那么使用异步方法下载字符串,并将其添加到缓存中,返回Task<string>结果。

2.Main方法:

    class Program
    {
        static void Main(string[] args)
        {
            //需要下载的url集合
            string[] urls = new string[] {
                "https://www.cnblogs.com",
                "http://msdn.microsoft.com",
                "http://www.microsoft.com"
            };

            //用于计时下载操作
            Stopwatch stopwatch = new Stopwatch();
            //开始计时下载url所需要的时间
            stopwatch.Start();
            var downloads = from url in urls
                            select CachedDownloads.DownloadStringAsync(url);
            Task.WhenAll(downloads).ContinueWith(results =>
            {
                stopwatch.Stop();
                //打印下载的字符数和运行时间。
                Console.WriteLine("Retrieved {0} characters. Elapsed time was {1} ms.",
                  results.Result.Sum(result => result.Length),
                  stopwatch.ElapsedMilliseconds);
            }).Wait();

            //重新计时
            stopwatch.Restart();
            downloads = from url in urls
                        select CachedDownloads.DownloadStringAsync(url);
            Task.WhenAll(downloads).ContinueWith(results =>
            {
                stopwatch.Stop();

                //打印下载的字符数和运行时间。
                Console.WriteLine("Retrieved {0} characters. Elapsed time was {1} ms.",
                   results.Result.Sum(result => result.Length),
                   stopwatch.ElapsedMilliseconds);
            }).Wait();

            Console.ReadKey();
        }
    }

测试结果:

3.结论

? 此示例计算两次下载多个字符串所需的时间。第二组下载操作应该比第一组少花费时间,因为结果保存在缓存中。该FromResult方法使DownloadStringAsync创建方法任务<TResult>持有这些预先计算的结果对象。

? 我对“预先”的理解为已经知道的结果,当一个方法需要返回Task对象时,如果有一种情况TResult已经预先知道,让么就可以使用Task.FromResult(TResult)方法返回Task对象。

? 参考资料:

  1. How to: Create Pre-Computed Tasks
  2. Task.FromResult(TResult) Method


    埼玉镇帖

原文地址:https://www.cnblogs.com/zaijianba/p/11442400.html

时间: 2024-10-30 03:49:23

如何使用Task.FromResult?的相关文章

c#—— Task.FromResult 的使用

Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法 比如有一个接口包含异步方法. interface IMyInterface { Task<int> DoSthAsync(); } 现在,需要以同步的方式实现该接口方法DoSthAsync,但要返回异步的结果.这正是Task.FromResult的用武之地. public class MyClass : IMyInterface { public Task<int>

Task.FromResult应用场景举例

Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法 比如有一个接口包含异步方法. interface IMyInterface { Task<int> DoSthAsync(); } 现在,需要以同步的方式实现该接口方法DoSthAsync,但要返回异步的结果.这正是Task.FromResult的用武之地. public class MyClass : IMyInterface { public Task<int>

c# Task.FromResult 的基本用法和实例

c#  Task.FromResult 的基本用法和实例 This method is useful when you perform an asynchronous operation that returns a Task object, and the result of that Task object is already computed There are two common use cases I've found: When you're implementing an in

实践基于Task的异步模式

Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueWith的方法实现的.基于语言的异步支持通过允许在正常控制流内部等待异步操作隐藏callbacks,具有和编译器生成的代码相同的API级别的支持. 在.Net 4.5,C#直接异步地支持等待的Task和Task<TResult>,在C#中使用"await"关键字.如果等待一个Ta

FromResult方法

private Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) {     if (context.ClientId == Clients.Client1.Id)     {         context.Validated(Clients.Client1.RedirectUrl);     }     else if (context.ClientId == Clients.Clien

Task Parallel Library02,更进一步

在前一篇中,了解了Task的基本用法 如果一个方法返回Task,Task<T>,如何获取Task的返回值,获取值的过程会阻塞线程吗? static void Main(string[] args) { var result = DoWorkAsync().Result; Console.WriteLine(result); Console.WriteLine("我会什么时候显示"); Console.ReadKey(); } static Task<string>

async await Task

一.使用Task 引用命名空间 using System.Threading.Tasks; 1.工厂方式 Task.Factory.StartNew(() => {Console.WriteLine("Hello Task library!"); }); 2.实例方式 Task task = new Task(() => PrintMessage()); task.Start();  3. .NET4.5 Task.Run(() => PrintMessage());

Task 使用

Task 常规使用 无返回值Task 普通的无返回值方法: static void Main(string[] args) { Console.WriteLine("开始调用"); GetTest(); Console.WriteLine("结束调用"); } /// <summary> /// 普通无返回值方法 /// </summary> static void GetTest() { Console.WriteLine("普通

Task作为返回值以及Task&lt;TResult&gt;作为返回值

async await return Task https://stackoverflow.com/questions/25191512/async-await-return-task Can somebody explain what does this means into a synchronous method? If I try to change the method to async then VS complain about it. This works: public Tas