首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

什么是异步?与多线程的差别

2012-08-03 
什么是异步?与多线程的区别?异步和多线程应该是两个概念吧。有个多线程的例子,如下:C# codepublic DDD aaa

什么是异步?与多线程的区别?
异步和多线程应该是两个概念吧。
有个多线程的例子,如下:  

C# code
public DDD aaa;            bbb = new Thread(new ThreadStart(aaa.ccc));            bbb.Start();    然后在类DDD中写的ccc方法public class DDD    { public void ccc()        {          //todo        }    }


希望高手举个类似如上代码的异步的例子?
感谢!!感谢!!

[解决办法]
主线程和bbb线程就是异步的
[解决办法]
Socket.BeginReceive 就异步了
[解决办法]
多线程可以制造异步的效果.

有阻塞(不干活,白白等待)就需要异步 无阻塞无需异步,无需多线程.
[解决办法]
C# code
public class UdpState     {         public UdpClient udpClient;         public IPEndPoint ipEndPoint;         public const int BufferSize = 1024;         public byte[] buffer = new byte[BufferSize];         public int counter = 0;     }     public class AsyncUdpSever     {         private IPEndPoint ipEndPoint = null;         private IPEndPoint remoteEP = null;         private UdpClient udpReceive = null;         private UdpClient udpSend = null;         private const int listenPort = 1100;         private const int remotePort = 1101;         UdpState udpReceiveState = null;         UdpState udpSendState = null;         private ManualResetEvent sendDone = new ManualResetEvent(false);         private ManualResetEvent receiveDone = new ManualResetEvent(false);         public AsyncUdpSever()         {             ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);             remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);             udpReceive = new UdpClient(ipEndPoint);             udpSend = new UdpClient();             udpReceiveState = new UdpState();                        udpReceiveState.udpClient = udpReceive;             udpReceiveState.ipEndPoint = ipEndPoint;             udpSendState = new UdpState();             udpSendState.udpClient = udpSend;             udpSendState.ipEndPoint = remoteEP;         }         public void ReceiveMsg()         {             Console.WriteLine("listening for messages");             while(true)             {                 lock (this)                 {                      IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);                     receiveDone.WaitOne();                     Thread.Sleep(100);                 }             }         }         private void ReceiveCallback(IAsyncResult iar)         {             UdpState udpReceiveState = iar.AsyncState as UdpState;             if (iar.IsCompleted)             {                 Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);                 string receiveString = Encoding.ASCII.GetString(receiveBytes);                 Console.WriteLine("Received: {0}", receiveString);                 //Thread.Sleep(100);                 receiveDone.Set();                 SendMsg();             }         }         private void SendMsg()         {             udpSend.Connect(udpSendState.ipEndPoint);             udpSendState.udpClient = udpSend;             udpSendState.counter ++;             string message = string.Format("第{0}个UDP请求处理完成!",udpSendState.counter);             Byte[] sendBytes = Encoding.Unicode.GetBytes(message);             udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);             sendDone.WaitOne();         }         private void SendCallback(IAsyncResult iar)         {             UdpState udpState = iar.AsyncState as UdpState;             Console.WriteLine("第{0}个请求处理完毕!", udpState.counter);             Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));             sendDone.Set();         }         public static void Main()         {             AsyncUdpSever aus = new AsyncUdpSever();             Thread t = new Thread(new ThreadStart(aus.ReceiveMsg));             t.Start();             Console.Read();         }     } 下面是客户端的 public class UdpState     {         public UdpClient udpClient = null;         public IPEndPoint ipEndPoint = null;         public const int BufferSize = 1024;         public byte[] buffer = new byte[BufferSize];         public int counter = 0;     }     public class AsyncUdpClient     {         public static bool messageSent = false;         // Receive a message and write it to the console.         private const int listenPort = 1101;         private const int remotePort = 1100;         private IPEndPoint localEP = null;         private IPEndPoint remoteEP = null;         private UdpClient udpReceive = null;         private UdpClient udpSend = null;         private UdpState udpSendState = null;         private UdpState udpReceiveState = null;         private int counter = 0;         private ManualResetEvent sendDone = new ManualResetEvent(false);         private ManualResetEvent receiveDone = new ManualResetEvent(false);         private Socket receiveSocket;         private Socket sendSocket;         public AsyncUdpClient()         {             localEP = new IPEndPoint(IPAddress.Any, listenPort);             remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0],remotePort);             udpReceive = new UdpClient(localEP);                        udpSend = new UdpClient();                         udpSendState = new UdpState();             udpSendState.ipEndPoint = remoteEP;             udpSendState.udpClient = udpSend;             udpReceiveState = new UdpState();             udpReceiveState.ipEndPoint = remoteEP;             udpReceiveState.udpClient = udpReceive;             receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);             receiveSocket.Bind(localEP);             sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);             sendSocket.Bind(remoteEP);         }         public void SendMsg()         {              udpSend.Connect(remoteEP);                         //Thread t = new Thread(new ThreadStart(ReceiveMessages));             //t.Start();             Byte[] sendBytes;             string message;                        while (true)             {                  message = "Client" + (counter++).ToString();                 lock (this)                 {                     sendBytes = Encoding.ASCII.GetBytes(message);                     udpSendState.counter = counter;                     udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);                     sendDone.WaitOne();                     Thread.Sleep(200);                     ReceiveMessages();                 }             }                    }         public void SendCallback(IAsyncResult iar)         {             UdpState udpState = iar.AsyncState as UdpState;             if (iar.IsCompleted)             {                 Console.WriteLine("第{0}个发送完毕!", udpState.counter);                 Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));                 //if (udpState.counter == 10)                 //{                 //    udpState.udpClient.Close();                 //}                 sendDone.Set();             }                    }         public void ReceiveMessages()         {             lock (this)             {                 udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);                 receiveDone.WaitOne();                 Thread.Sleep(100);             }          }         public void ReceiveCallback(IAsyncResult iar)         {             UdpState udpState = iar.AsyncState as UdpState;             if (iar.IsCompleted)             {                 Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);                 string receiveString = Encoding.Unicode.GetString(receiveBytes);                 Console.WriteLine("Received: {0}", receiveString);                 receiveDone.Set();             }                    }                 public static void Main()         {             AsyncUdpClient auc = new AsyncUdpClient();             auc.SendMsg();             Console.Read();         } 


[解决办法]
可以说异步委托调用的本质上也是多线程。
异步例子

C# code
    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 ///    12 /// The main entry point for the application.  13 ///    14 [STAThread]  15 static void Main()  16 {   17 AsyncFuncDelegate caller = new AsyncFuncDelegate(Func);   18 Console.WriteLine("Input number please...");   19 caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), new AsyncCallback(CallBackFunc), "Message from Main thread.");  20 Console.WriteLine("Main thread ends");   21 Console.ReadLine();  22 }   23 delegate string AsyncFuncDelegate(int userInput);   24 static string Func(int userInput)  25 {   26 Console.WriteLine("Func start to run");   27 Console.WriteLine("...");  28 Thread.Sleep(5000);   29 Console.WriteLine("Func end to run");   30 return userInput.ToString();  31 }   32 static void CallBackFunc(IAsyncResult ar)  33 {   34 AsyncResult result = ar as AsyncResult;   35 string inputMessage = result.AsyncState as string;   36 AsyncFuncDelegate caller = result.AsyncDelegate as AsyncFuncDelegate;  37 Console.WriteLine("call back starts");   38 Console.WriteLine(inputMessage);   39 Console.WriteLine("The input number is : " + caller.EndInvoke(ar));  40 Console.WriteLine("call back ends");  41 }  42 }   43 }
[解决办法]
异步就是用多线程实现的
[解决办法]
C#异步调用的几种方式介绍
[解决办法]
这个帖子要关注
[解决办法]
关注~
[解决办法]
这个问题我之前也疑惑了很久很久很久很久
后来做的东西多了才慢慢领悟到
我感觉可以用一句话来说
多线程是一种技术,而异步就是用多线程来实现的
[解决办法]
具体的实现本质不太清楚,不过在使用的过程中发现似乎,委托、异步都是通过多线程来实现的~
[解决办法]
关注,学习
异步是需要多线程来实现的吧
很模糊的感觉,不知道说的对不对
[解决办法]
异步是个时序的概念,与同步相对...你要是认真学过计算机基础课程没理由不知道...

多线程和异步没有直接关系,只是程序可以利用多线程实现异步调用...通过回调函数或委托实现的异步调用都是利用多线程的...

在其他领域,异步和多线程八杆子打不着...
[解决办法]
引用楼上的 朋友
[解决办法]
什么叫多线程,我老搞不明白,所谓不明白,不明白,多线程是一个名词,还是一个动词?

是指一种活动,还是指一种名称,

我感觉多线程,应该是多个线程之间有交互的,相互协作的工作过程,应该才叫多线程吧,开两个无关的线程,应该不叫做多线程吧,

如果按这样的理解,异步和多线程就有很大区别了,

[解决办法]
学习一下!
[解决办法]
所谓异步,是由.net系统来在后台做工作,做完后回调你的代码。至于如何创建线程、何时调度线程、如何优化系统线程池,这是.net系统的事,你用不着越俎代庖。

打个比方,异步就好象是五星级酒店服务(自动化比较高、意外比较少),而传统的多线程就好象是路边摊个人开的只有10几个房间的小旅馆(你要做好自助和解决社会矛盾的准备)。
[解决办法]
探讨
什么叫多线程,我老搞不明白,所谓不明白,不明白,多线程是一个名词,还是一个动词?

是指一种活动,还是指一种名称,

我感觉多线程,应该是多个线程之间有交互的,相互协作的工作过程,应该才叫多线程吧,开两个无关的线程,应该不叫做多线程吧,

如果按这样的理解,异步和多线程就有很大区别了,

------解决方案--------------------


mark
关注
[解决办法]
两者没有直接关系。
异步是针对当前线程处理的时序上的概念,例如我让别人帮我拿个东西,我不会什么都不做的傻等他。
多线程式针对同步完成多项任务。不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。多线程是在同一时间需要完成多项任务的时候实现的。
[解决办法]

探讨
异步和多线程应该是两个概念吧。
有个多线程的例子,如下:

C# code

public DDD aaa;

bbb = new Thread(new ThreadStart(aaa.ccc));
bbb.Start();
然后在类DDD中写的ccc方法
public class DDD
{
publi……

[解决办法]
关注,学习下
[解决办法]
mark
以后学习
[解决办法]
探讨
所谓异步,是由.net系统来在后台做工作,做完后回调你的代码。至于如何创建线程、何时调度线程、如何优化系统线程池,这是.net系统的事,你用不着越俎代庖。

打个比方,异步就好象是五星级酒店服务(自动化比较高、意外比较少),而传统的多线程就好象是路边摊个人开的只有10几个房间的小旅馆(你要做好自助和解决社会矛盾的准备)。

[解决办法]
嗯,帮顶
[解决办法]
个人理解,异步的本质就是系统自己实现的多线程。
[解决办法]
呵呵 只会用但是不懂原理 挺郁闷的
[解决办法]
学习ing
[解决办法]
异步可以用多线程来实现
异步的比仅仅多线程

多线程可以实现异步



热点排行