异步委托怎么写( 三 )


同步异步是一个相对的概念,相对于UI主线程来说,当然是异步的,所以这样调用不会造成UI界面假死;相对于你新开的线程来说,这是一个同步的过程,必须等这个Invoke执行完才能往下进行,如果下面还有代码的话 。
如果你想异步得更彻底些,就用BeginInvoke
是不是在同一个时间点只能有一个子线程在运行???
如果是单核的CPU,当然只能有一个线程运行,目前的CPU大多是双核及以上,所以会有同时运行两个线程的可能 。
8.c#中断异步操作using System; using System.Net; using System.Threading; using System.Text; using System.IO; //Request 类用于通过 //异步调用传递数据 public class RequestState { const int BUFFER_SIZE = 1024; public StringBuilder RequestData; public byte[] BufferRead; public HttpWebRequest Request; public Stream ResponseStream; //创建适当编码类型的解码器 public Decoder StreamDecode = Encoding.UTF8.GetDecoder(); public RequestState() { BufferRead=new byte[BUFFER_SIZE]; RequestData = http://www.xuexi88.com/zhishi/new StringBuilder(""); Request = null; ResponseStream = null; } } //ClientGetAsync发出异步请求 class ClientGetAsync { public static ManualResetEvent allDone=new ManualResetEvent(false); const int BUFFER_SIZE = 1024; public static void Main(string[] args) { if (args.Length 0) { //准备Char 数组缓冲区,用于向Unicode转换 Char[] charBuffer = new Char[BUFFER_SIZE]; //将字节流转换为Char 数组,然后转换为字符串 //len显示多少字符被转换为Unicode int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0); String str = new String(charBuffer, 0, len); rs.RequestData.Append(str); IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs); } else { if (rs.RequestData.Length > 1) { // 所有数据都已被读取,因此将其显示到控制台 string strContent; strContent = rs.RequestData.ToString(); Console.WriteLine(strContent); } //关闭响应流 responseStream.Close(); allDone.Set(); } return; } } 2. 判断控件的Handle是在当前线程中,则无需异步执行,否则要异步if (this.gcDC.InvokeRequired) { dlgt = new (OnLevelRegionChanged); this.Invoke(dlgt, new object[] { sender, ev }); } 3. 开启新线程可以通过开启新线程来执行异步操作,并给异步操作方法传递参数 。
参数通常包括异步方法所需的所有数据 。Thread thread=new Thread(new (GetDataFromWebService)); private static void GetDataFromWebService(object entity){ showWindow(); getData(); window.clost(); } 4.在界面线程外打开程序resultsCollection.AddRange(entity.DataCol); InsertIntoTable(resultsCollection, "", entity.tableName, entity.Schema, "", entity.IsNewFetch); if (window != null) { #region[Close progess window] System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => { (window.WpfUIElement as System.Windows.Window).Close(); entity.SetNexValue(); })); #endregion } 。
9.C#中的委托到底是什么概念委托,简单理解是这样的.比如您要管您的孩子,把孩子送进了幼儿园.OK.此时您就把您的孩子委托给了幼儿园.当幼儿园放学,将孩子交还给您的手中.则是委托的回调.当然我这里的例子是说异步委托调用.您也可以同步.什么是同步委托调用?您去银行存钱.把钱给柜员.他们帮你点钞.存款然后给您存折或卡.那么您就相当于把钱委托给了柜员让他去执行存钱的这个函数.明白了么?Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类 。
与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用" 。它所实现的功能与C/C++中的函数指针十分相似 。
它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m 。但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点 。