多线程编程模型APM 、EAM、TAP

C#7.0编程

一、异步编程模式APM

相似xxxBegin,xxxEnd 一对方法委托线程池执行异步

 Func<int> b = new Func<int>(() =>
            {
                return 10;
            });

            b.BeginInvoke(x =>
            {
                int r = b.EndInvoke(x);
            }, null);

其余例如FileStream.ReadBegin,ReadEnd等异步编程

fs.BeginRead(bytes, 0, bytes.Length, ar =>
{
    var r = fs.EndRead(ar);
Console.WriteLine(r);

}, null);

  

二、基于事件的编程模型(EAP)

相似xxxAsync 线程

 WebClient client = new WebClient();
            Uri uri = new Uri("http://www.baidu.com");
            client.DownloadDataCompleted += (sender, e) =>
            {
                byte[] bytes = e.Result;
            };
            client.DownloadDataAsync(new Uri("http://www.baidu.com"));

  

三、基于Task的编程模型(TAP)

APM和EAP都能包装成Task使用(微软推荐使用Task)blog

以下使用Task.Factory.FromAsync()包装APM为TAP事件

 Action a = new Action(() =>
            {
                Console.WriteLine("hello");
            });
           
            Task.Factory.FromAsync(a.BeginInvoke, a.EndInvoke, string.Empty);

  

 string path = Environment.CurrentDirectory + "/2.txt";

            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                byte[] bytes = new byte[fs.Length];
                Task<int> t = Task.Factory.FromAsync(fs.BeginRead, fs.EndRead, bytes, 0, bytes.Length, null);
                Console.WriteLine(t.Result);
            }

以下使用TaskCompletionSource包装EAP为TAPstring

public static Task<int> DoS()
        {
            TaskCompletionSource<int> taskCompletionSource = new TaskCompletionSource<int>();

            WebClient client = new WebClient();

            client.DownloadDataAsync(new Uri("http://www.baidu.com"));
            client.DownloadStringCompleted += (sender, e) =>
            {
                try
                {
                    taskCompletionSource.TrySetResult(e.Result.Length);
                }
                catch (Exception ex)
                {
                    taskCompletionSource.TrySetException(ex);
                }
            };

            client.DownloadDataAsync(new Uri("http://www.baidu.com"));
            return taskCompletionSource.Task;
        }

  如下方法内部也是使用TaskCompletionSourceit

Task<byte[]> Task = client.DownloadDataTaskAsync(uri);
相关文章
相关标签/搜索