c# 异步处理啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 异步处理啥意思?相关的知识,希望对你有一定的参考价值。
程序处理一个步骤,返回结果,你再在结果的基础上动作,返回结果之前只能等着,这算是同步。异步的时候,就不等了,先干别的。追问
能否写个小例子?谢谢!
追答看看技术博客就明白了
参考资料:http://blog.csdn.net/Come_On_steven/archive/2009/07/08/4332249.aspx
参考技术A 异步,比如,小李让小张帮忙去打饭,这时小李不知道小张何时回来,在这段时间内小李可以做一些其他的事情,只是小张打饭回来了通知小李就ok。所以异步就是接收方不知道发送方什么时候发送,所以发送的信息中就要有提示接收方开始接收信息的。还有一种是针对多线程而言,在多线程中有同步和异步之分,如果使用同步表示这些线程可能存在资源竞争的情况(比如生产者消费者问题)。如果不存在资源竞争的情况那么就可以使用异步处理的形式,当异步线程调用完毕的时候通知主线程。
异步和多线程的区别
这个经常搞混了,因为在平时编写程序的时候,只要使用多线程不采用同步机制,那么都可以理解成为是异步的处理。
但是今天我们还是要弄清楚他们之间的区别。异步编程中开发者不用操心线程,代码中不会出现线程语句。因为,采用异步的时候,.NET已经自动创建了异步线程了,不用人为的再去创建线程了。(PS:创建线程,线程调度,优化系统线程池这些事情都由系统自己处理。)
例如:
using System;
namespace ConsoleApplication1
class Program
static void Main(string[] args)
DDD aaa = new DDD();
((Action)aaa.ccc).BeginInvoke(null, null);
Console.WriteLine("干完了吗?");
Console.ReadKey();
public class DDD
public void ccc()
Console.WriteLine("刚刚干完。");
总之:多线程是一种技术,而异步就是用多线程来实现的。
如何实现一个异步调用
使用异步Ping其他机器
Ping ping = new Ping();
ping.SendAsync(IPAddress,Int32,Object) //尝试异步方式向指定的IPAddress的计算机发送Internet控制消息协议(ICMP)会送消息,并从该计算机接收相应的ICMP会送答复消息。
使用异步访问web页面
void Execute()
//构建HttpWebRequest对象
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(item.Config);
request.Timeout = int.Parse(ConfigurationManager.AppSettings["WebTimeOut"]);
//构建WebRequestItem对象,将监控对象与HttpWebRequest包含在其中
WebRequestItem webItem = new WebRequestItem Item = item, httpRequest = request ; //这个WebRequestItem 对象自己构件。
//异步访问页面
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(IGetResponse), webItem); //异步访问,并将webItem参数传递给异步回调函数IGetResponse(IAsyncResult)
void IGetResponse(IAsyncResult result)
//获取传入的WebRequestItem对象
WebRequestItem webItem = (WebRequestItem)result.AsyncState;
//获取WebRequestItem对象中的HttpWebRequest请求
HttpWebRequest request = webItem.httpRequest;
//异步访问页面
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
if (response.StatusCode == HttpStatusCode.OK) //能够成功访问
//TODO:
C#中的“var”是啥意思? [复制]
【中文标题】C#中的“var”是啥意思? [复制]【英文标题】:What does "var" mean in C#? [duplicate]C#中的“var”是什么意思? [复制] 【发布时间】:2011-05-17 11:41:30 【问题描述】:在 C# 中,关键字 var
是如何工作的?
【问题讨论】:
【参考方案1】:这意味着数据类型是从上下文中派生(隐含)的。
来自http://msdn.microsoft.com/en-us/library/bb383973.aspx
从 Visual C# 3.0 开始,变量 在方法范围内声明的可以 有一个隐式类型 var。一个 隐式类型的局部变量是 强类型,就像你有 自己声明了类型,但是 编译器确定类型。这 以下两个 i 声明是 功能等效:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var
可用于消除键盘输入和视觉噪音,例如,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
变成
var x = new MyReallyReallyLongClassName();
但过度使用会牺牲可读性。
【讨论】:
【参考方案2】:这意味着被声明的本地的类型将由编译器根据其第一次赋值来推断:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
值得注意的是,var
没有将变量定义为动态类型。所以这是不合法的:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var
只有两种用途:
-
声明变量需要更少的输入,尤其是在将变量声明为嵌套泛型类型时。
在存储对匿名类型对象的引用时必须使用它,因为无法预先知道类型名称:
var foo = new Bar = "bar" ;
您不能将var
用作除本地人以外的任何类型。所以你不能使用关键字var
来声明字段/属性/参数/返回类型。
【讨论】:
@cdhowie 如果说var foo = new Foo()
、foo
可以是Foo
类型或其任何超类。这怎么可能合法?
@Djack 这不合法,事实并非如此。 var foo = new Foo();
与Foo foo = new Foo();
是一回事,这意味着foo
可以包含Foo
引用,或者对任何Foo
对象的引用sub 类型,not Foo
超级类型。【参考方案3】:
“var”表示编译器将根据使用情况确定变量的显式类型。例如,
var myVar = new Connection();
会给你一个 Connection 类型的变量。
【讨论】:
【参考方案4】:你曾经讨厌编写这样的变量初始化器吗?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
因此,从 C# 3.0 开始,您可以将其替换为
var xmlSerializer = new XmlSerialzer(typeof(int))
一个通知:类型在编译期间被解析,所以性能没有问题。但是编译器应该能够在构建步骤中检测类型,所以像var xmlSerializer;
这样的代码根本无法编译。
【讨论】:
【参考方案5】:它根据初始化时分配给它的内容声明一个类型。
一个简单的例子就是代码:
var i = 53;
将检查 53 的类型,并基本上将其重写为:
int i = 53;
请注意,虽然我们可以:
long i = 53;
var 不会发生这种情况。虽然它可以:
var i = 53l; // i is now a long
同样:
var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.
这对于复杂的类型来说可能是一个小小的便利。匿名类型更重要:
var i = from x in SomeSource where x.Name.Length > 3 select new x.ID, x.Name;
foreach(var j in i)
Console.WriteLine(j.ID.ToString() + ":" + j.Name);
这里没有其他方法可以定义i
和j
,而是使用var
,因为它们所拥有的类型没有名称。
【讨论】:
【参考方案6】: 顾名思义,var 是没有任何数据类型的变量。 如果您不知道任何方法会返回哪种类型的数据,这种情况下使用 var 比较好。 var 是隐式类型,这意味着系统将自行定义数据类型。编译器将根据“=”运算符右侧的值推断其类型。 int/string 等是由您明确定义的显式类型。 Var 只能在方法中定义为局部变量 不能在单个语句中声明和初始化多个变量。例如,var i=1,j=2;无效。int i = 100;// explicitly typed
var j = 100; // implicitly typed
【讨论】:
【参考方案7】:var 是 C# 中的“上下文关键字”,这意味着您只能在使用该变量的同一类的上下文中隐式地将其用作局部变量。如果您尝试在从“Main”或其他外部类或接口调用的类中使用它,您将收到错误 CS0825 https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs0825 >
请参阅此处的文档中有关何时可以使用和不能使用它的备注:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables#remarks >
基本上,您应该只在声明具有隐含值的变量时使用它,例如“var myValue = “This is the value”;与说“字符串”相比,这可以节省一点时间,但恕我直言节省了大量时间,并限制了项目的可扩展性。
【讨论】:
以上是关于c# 异步处理啥意思?的主要内容,如果未能解决你的问题,请参考以下文章