.Net异步处理温习

这几天,看WF本质论,里面提到了.net的异步处理。由于里面使用的是代码片段,所以有点看不懂。于是下定决心,温习一下.net中的异步处理。

使用C#在.net开发已经有5年了,最初使用.net中的异步处理大约是在4年前。当时,只是为了实现要求的功能,没有详细研究。这也难怪看WF时会头晕(基础不牢的后果呀)。

首先,我们分析一下异步处理的环境

1. 需要在当前线程中获取返回值

2. 不需要在当前线程中获取返回值,但是仍然需要对返回值做处理

对于第1中情况,还可以继续细分

1. 在当前线程中启动线程T,然后继续执行当前线程中的其它任务,最后在当前线程中获取T的返回值

2. 在当前线程中启动线程T,然后继续执行当前线程中的其它任务R1,等待T执行完成,当T执行完成后,继续执行当前线程中的其它任务R2,最后获取T的返回值

3. 在当前线程中启动线程T,只要T在执行就执行任务R,最后获取T的返回值

下面,我将一一给出例子:

1.1 在当前线程中启动线程T,然后继续执行当前线程中的其它任务,最后在当前线程中获取T的返回值

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Windows.Forms;
05 using System.Threading;
06 using System.Runtime.Remoting.Messaging;
07 namespace FirstWF
08 {
09     static class Program
10     {
11         /// <summary>
12         /// The main entry point for the application.
13         /// </summary>
14         [STAThread]
15         static void Main()
16         {
17             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func);
18             Console.WriteLine("Input number please...");
19             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null);
20             Console.WriteLine("Implement other tasks");
21             Thread.Sleep(7000);
22             Console.WriteLine("Implement other tasks end ...");
23             Console.WriteLine("Get user's input");
24             Console.WriteLine(caller.EndInvoke(result));
25             Console.ReadLine();
26         }
27         delegate string AsyncFuncDelegate(int userInput);
28         static string Func(int userInput)
29         {
30             Console.WriteLine("Func start to run");
31             Console.WriteLine("...");
32             Thread.Sleep(5000);
33             Console.WriteLine("Func end to run");
34             return userInput.ToString();
35         }
36     }
37 }

输出结果如下:

Implement other tasks
Func start to run
...
Func end to run
Implement other tasks end ...
Get user's input
56

时间: 2024-09-10 11:42:58

.Net异步处理温习的相关文章

Windows 8应用开发之异步调用

 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现. 本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过程是由异步进行的,这个过程中为了测试用户仍然可以与应用交互,我们再

python的分布式任务huey如何实现异步化任务讲解

 本文我们来分享一个python的轻型的任务队列程序,他可以让python的分布式任务huey实现异步化任务,感兴趣的朋友可以看看.     一个轻型的任务队列,功能和相关的broker没有celery强大,重在轻型,而且代码读起来也比较的简单.  关于huey的介绍:  (比celery轻型,比mrq.rq要好用 !) a lightweight alternative.     written in python     no deps outside stdlib, except redi

如何使用ASP脚本制作异步装载的树形结构(一)

脚本|异步 树形结构是描述层次数据的常见方法.本文介绍的树形结构生成程序主要由一个ASP页面.二个JavaScript函数构成.该树形结构是异步的,也就是说,节点数据仅在必要时才读取,而不是一次性全部发送到客户端. 一.概述 树形结构中所有的节点都必须包含以下属性:本身的ID,父节点的ID,以及本节点的说明(节点文本).本文用到了一个Access数据库Tree.mdb来保存这些节点信息.Tree.mdb包含表tblTree,其定义如下: 字段名称 类型 说明 ElementID 自动编号 节点的

异步上传UploadFileAsync老是提示有无效参数,错在哪里

问题描述 异步上传UploadFileAsync老是提示有无效参数,错在哪里 错在哪里 ???文件明明是存在的 解决方案 第一个参数不对,应该放在new Uri()里面. 解决方案二: 第一个参数是Uri,你传递string当然错了 c.UploadFileAsync(new Uri(""http://localhost:.................."")POST"".........."")

关于支付系统中的同步通知和异步通知电商的区别,为什么需要通知

问题描述 关于支付系统中的同步通知和异步通知电商的区别,为什么需要通知 在电商对应的支付系统中当支付完成之后需要做相关的同步通知和异步通知操作,请大神解释一下什么是同步通知和异步通知,为什么需要同步通知和异步通知. 解决方案 同步用于即时通知支付完成 异步用于防止信息漏发漏收 解决方案二: 可以这样理解, 1.用户(买家)支付完成后,电商平台需要实时的给用户一个通知,如支付已经处理等待订单确认. 2.电商平台,这块就需要考虑系统技术方面的各个环节,考虑应对复杂多变的并发用户量.业务.流量.网络环

分享一个异步任务在遇到IO异常时支持递归回调的辅助方法

public void TryAsyncActionRecursively<TAsyncResult>( string asyncActionName, Func<Task<TAsyncResult>> asyncAction, Action<int> mainAction, Action<TAsyncResult> successAction, Func<string> getContextInfoFunc, Action<E

再谈IO的异步,同步,阻塞和非阻塞

原本转过一个<六种Socket I/O模型幽默讲解>,里面用比喻的方法讲解各种IO,但说到底那个时候我对同步异步这些还是只知其表.还未能完全理解异步和同步,现在觉得清晰一些了.总结一下. 前提概要: IO的过程: 整个IO的过程其实是应用发起IO的请求,到应用获取到IO请求数据的中间过程. 这个中间,其实主要的时间就是系统准备数据的过程.这也是异步技术的优化所在. 对系统调用的理解: 首先,我们要明确一点.IO的操作属于一种系统调用.也就是应用在运行中,进入到内核代码来执行某些重要的操作. 其

ODBC中的同步与异步执行模式

1.引言 近年来,随着计算机局域网技术的不断发展,计算机体系结构已经发展到复杂而开放的客户机/服务器模式.对于客户机/服务器应用的开发,现在常用的前端开发工具有:VisualBasic.Delphi.PowerBuilder等.它们可通过ODBC接口访问服务器的SQLServer数据库服务器. VisualBasic.Delphi.PowerBuilder等开发工具在使用ODBC2.0来编写程序时,通常会提供三种方法来进行数据库应用程序的方案设计: ·使用数据控制项 ·使用数据库对象变量进行编程

关于异步任务设计的几点思考

为什么需要异步任务 手机上的CPU和内存等资源是有限的. android应用有一个主线程常用于界面的更新.如果所有事情(包括耗时操作,IO操作,网络操作)都在主线程进行,可能因为系统无法及时处理而导致界面卡顿,甚至ANR. 为了避免ANR,解决卡顿问题,提高应用操作流畅性,我们需要把(耗时操作,IO操作,网络操作)等耗时/耗资源的操作放到异步的子线程中进行. ANR超时时间在ActivityManagerService.java文件中进行了定义 1.前台broadcast超时时间为10秒,后台b