什么是异步?与多线程的区别?
异步和多线程应该是两个概念吧。
有个多线程的例子,如下:
public DDD aaa; bbb = new Thread(new ThreadStart(aaa.ccc)); bbb.Start(); 然后在类DDD中写的ccc方法public class DDD { public void ccc() { //todo } }
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(); }
[解决办法]
可以说异步委托调用的本质上也是多线程。
异步例子
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几个房间的小旅馆(你要做好自助和解决社会矛盾的准备)。
[解决办法]