异步编程模型

class Program
    {
        static void Main(string[] args)
        {
            var func = new Func<string, string>(i => { return i + "i can fly"; });

            var state = func.BeginInvoke("yes,", Callback, func);

            Console.Read();
        }

        static void Callback(IAsyncResult async)
        {
            var result = async.AsyncState as Func<string, string>;

            Console.WriteLine(result.EndInvoke(async));
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            var func = new Func<string, string>(i =>
            {
                return i + "i can fly";
            });

            Task<string>.Factory.FromAsync(func.BeginInvoke, func.EndInvoke, "yes,", null).ContinueWith
                (i =>
                {
                    Console.WriteLine(i.Result);
                });

            Console.Read();
        }
    }

static void Main(string[] args)
        {
            var path = "C://1.txt";

            FileStream fs = new FileStream(path, FileMode.Open);

            FileInfo info = new FileInfo(path);

            byte[] b = new byte[info.Length];

            var asycState = fs.BeginRead(b, 0, b.Length, (result) =>
            {
                var file = result.AsyncState as FileStream;

                Console.WriteLine("文件内容:{0}", Encoding.Default.GetString(b));

                file.Close();

            }, fs);

            Console.WriteLine("我是主线程,我不会被阻塞!");

            Console.Read();
        }

static void Main(string[] args)
        {
            var path = "C://1.txt";

            FileStream fs = new FileStream(path, FileMode.Open);

            FileInfo info = new FileInfo(path);

            byte[] b = new byte[info.Length];

            Task<int>.Factory.FromAsync(fs.BeginRead, fs.EndRead, b, 0, b.Length, null, TaskCreationOptions.None)
                .ContinueWith
                (i =>
                {
                    Console.WriteLine("文件内容:{0}", Encoding.Default.GetString(b));
                });

            Console.WriteLine("我是主线程,我不会被阻塞!");

            Console.Read();
        }

class Program
    {
        static byte[] b;

        static void Main()
        {
            string[] array = { "C://1.txt", "C://2.txt", "C://3.txt" };

            List<Task<string>> taskList = new List<Task<string>>(3);

            foreach (var item in array)
            {
                taskList.Add(ReadAsyc(item));
            }

            Task.Factory.ContinueWhenAll(taskList.ToArray(), i =>
            {
                string result = string.Empty;

                //获取各个task返回的结果
                foreach (var item in i)
                {
                    result += item.Result;
                }

                //倒序
                String content = new String(result.OrderByDescending(j => j).ToArray());

                Console.WriteLine("倒序结果:"+content);
            });

            Console.WriteLine("我是主线程,我不会被阻塞");

            Console.ReadKey();
        }

        //异步读取
        static Task<string> ReadAsyc(string path)
        {
            FileInfo info = new FileInfo(path);

            byte[] b = new byte[info.Length];

            FileStream fs = new FileStream(path, FileMode.Open);

            Task<int> task = Task<int>.Factory.FromAsync(fs.BeginRead, fs.EndRead, b, 0, b.Length, null, TaskCreationOptions.None);

            //返回当前task的执行结果
            return task.ContinueWith(i =>
            {
                return i.Result > 0 ? Encoding.Default.GetString(b) : string.Empty;
            }, TaskContinuationOptions.ExecuteSynchronously);
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            WebClient client = new WebClient();

            client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(client_DownloadFileCompleted);

            client.DownloadFileAsync(new Uri("http://imgsrc.baidu.com/baike/abpic/item/6a600c338744ebf844a0bc74d9f9d72a6159a7ac.jpg"),
                                   "1.jpg", "图片下完了,你懂的!");

            Console.WriteLine("我是主线程,我不会被阻塞!");
            Console.Read();
        }

        static void client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            Console.WriteLine("\n" + e.UserState);
        }
    }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Net;
using System.ComponentModel;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main()
        {
            var downloadTask = DownLoadFileInTask(
                    new Uri(@"http://www.7720mm.cn/uploadfile/2010/1120/20101120073035736.jpg")
                    , "C://1.jpg");

            downloadTask.ContinueWith(i =>
            {
                Console.WriteLine("图片:" + i.Result + "下载完毕!");
            });

            Console.WriteLine("我是主线程,我不会被阻塞!");

            Console.Read();
        }

        static Task<string> DownLoadFileInTask(Uri address, string saveFile)
        {
            var wc = new WebClient();

            var tcs = new TaskCompletionSource<string>(address);

            //处理异步操作的一个委托
            AsyncCompletedEventHandler handler = null;

            handler = (sender, e) =>
            {
                if (e.Error != null)
                {
                    tcs.TrySetException(e.Error);
                }
                else
                {
                    if (e.Cancelled)
                    {
                        tcs.TrySetCanceled();
                    }
                    else
                    {
                        tcs.TrySetResult(saveFile);
                    }
                }

                wc.DownloadFileCompleted -= handler;
            };

            //我们将下载事件与我们自定义的handler进行了关联
            wc.DownloadFileCompleted += handler;

            try
            {
                wc.DownloadFileAsync(address, saveFile);
            }
            catch (Exception ex)
            {
                wc.DownloadFileCompleted -= handler;

                tcs.TrySetException(ex);
            }

            return tcs.Task;
        }
    }
}

原文地址:https://www.cnblogs.com/liuqifeng/p/9149841.html

时间: 2024-10-24 21:41:15

异步编程模型的相关文章

多线程之异步编程: 经典和最新的异步编程模型,async与await

经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类Thread/Async/ClassicAsync.cs /* * 使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类 */ using System; using System.Collections.Ge

简单地使用线程之一:使用异步编程模型

.NetFramework的异步编程模型从本质上来说是使用线程池来完成异步的任务,异步委托.HttpWebRequest等都使用了异步模型. 这里我们使用异步委托来说明异步编程模型. 首先,我们来明确一下,对于多线程来说,我们需要关注哪些问题. “线程是一段执行中的代码流”,从这句话中,我们可以关注这段代码流何时开始执行.何时结束.从主线程如何传递参数至从子线程.从子线程如何返回结果至主线程? 问题1:在异步编程模型中,子线程何时开始执行? 对于异步编程模型来说,使用BeginXXX来开始执行线

C#异步编程模型

什么是异步编程模型 异步编程模型(Asynchronous Programming Model,简称APM)是C#1.1支持的一种实现异步操作的编程模型,虽然已经比较"古老"了,但是依然可以学习一下的.通过对APM的学习,我总结了以下三点: 1. APM的本质是使用委托和线程池来实现异步编程的. 2. 实现APM的关键是要实现IAsyncResult接口. 3. 实现了APM的类都会定义一对形如BeginXXX()和EndXXX()的方法,例如,FileStream类定义了BeginR

.net异步编程の-------异步编程模型(APM)

术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event-based Asynchronous Pattern TAP                基于任务的异步编程模式, Task-based Asynchronous Pattern 一.异步编程 APM即异步编程模型的简写(Asynchronous Programming Model),大家在写代

.NET &ldquo;底层&rdquo;异步编程模式&mdash;&mdash;异步编程模型

本文内容 异步编程类型 环境 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Programming Model,APM),它们的中文翻译只差一个字,英文名称差在最后一个单词,看英文一个是 Pattern,一个是 Model.Model 比 Pattern 更具体.前者是一个统称,比后者含义要广,前者包含三个模型,而 APM 只是它其中一个而已. 个人理解,异步编程模型(APM

异步编程模型(APM)

一.概念 APM即异步编程模式的简写(Asynchronous Programming Model).大家在写代码的时候或者查看.NET 的类库的时候肯定会经常看到和使用以BeginXXX和EndXXX类似的方法,其实你在使用这些方法的时候,你就再使用异步编程模型来编写程序.NET Framework很多类也实现了该模式,同时我们也可以自定义类来实现该模式,(也就是在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和EndXXX方法),另外委托类型也定义了BeginI

8天玩转并行开发——第六天 异步编程模型

在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能有人会问,这样做有什么好处,下面一一道来. 一: Begin/End模式 1: 委托 在执行委托方法的时候,我们常常会看到一个Invoke,同时也有一对你或许不常使用的BeginInvoke,EndInvoke方法对,当然Invoke方法 是阻塞主线程,而BeginInvoke则是另开一个线程. 1 class Program 2 { 3 sta

APM异步编程模型

使用 IAsyncResult 设计模式的异步操作 是通过名为 "Begin" 操作名称OperationName 和 "End"操作名称OperationName 的两个方法来实现的, 这两个方法分别开始和结束异步操作 操作名称OperationName. 例如,FileStream 类提供 BeginRead 和 EndRead 方法来从文件异步读取字节. 这两个方法实现了 Read 方法的异步版本. 在调用"Begin" 操作名称Opera

概述异步编程模型

回调函数 事件监听 观察者模式 Promise async.await 原文地址:https://www.cnblogs.com/wuqilang/p/11366992.html