zoukankan      html  css  js  c++  java
  • .Net异步机制

    引自博客:Yes I Can 什么是.Net异步调用机制

    代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.ComponentModel;//ISynchronizeInvoke
    using System.Runtime.Remoting.Messaging;//AsyncResult
    using System.Windows.Forms;
    using System.Threading;

    namespace WinApp
    {
        
    public class AsyncQueryHelper
        {
            FrmProgressBar frmProgressBar 
    = null;

            
    public AsyncQueryHelper()
            {
                frmProgressBar 
    = new FrmProgressBar(10);
            }

            
    public delegate DataSet ExecQueryHandler(DataSet dsRequest);
            
    public ExecQueryHandler execQueryHandlerInstance = null;

            
    private AsyncCallback asyncCallbackInstance = null;
            
    public void ExecQuery(DataSet dsRequest)
            {
                frmProgressBar.StartThread();
                asyncCallbackInstance 
    = new AsyncCallback(ExecAsyncCallBack);//<=>asyncCallbackInstance = ExecAsyncCallBack;

                
    if (execQueryHandlerInstance != null)
                {
                    
    //execQueryHandlerInstance.BeginInvoke(dsRequest, asyncCallbackInstance, execQueryHandlerInstance);
                    IAsyncResult result = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);//同上

                    
    //=======================WaitOne=======================//
                    
    //阻碍当前线程,直到异步调用结束
                    result.AsyncWaitHandle.WaitOne();
                    
    //开始其他工作.
                    
    //DoAnotherWork();

                    
    //=======================WaitAll=======================//
                    /*
                    IAsyncResult result1 = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);
                    IAsyncResult result2 = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);
                    //把所有异步的句柄保存到WaitHandle 对象中
                    WaitHandle[] waitHandles = { result1.AsyncWaitHandle, result2.AsyncWaitHandle };
                    //阻碍当前线程,直到所有异步调用结束
                    WaitHandle.WaitAll(waitHandles);
                    //开始其他工作
                    //DoAnotherWork();
                    
    */

                    
    //====WaitAny:可以使用 WaitAny 来指定某个/某几个委托先等待=====//
                    /*
                     WaitHandle[] oneWaitHandle = { result1.AsyncWaitHandle };
                     WaitHandle.WaitAny(oneWaitHandle);
                     //开始其他工作
                     //DoAnotherWork();
                    
    */
                }
            }

            
    public delegate void BindDataToGrid(DataSet dsReponse);
            
    public BindDataToGrid bindDataToGridInstance = null;

            
    public DataGridView dataGridView = null;
            
    public void ExecAsyncCallBack(IAsyncResult asyncResult)
            {
                endHandlerInstance 
    = new EndHandler(frmProgressBar.EndThread);
                frmProgressBar.BeginInvoke(endHandlerInstance, 
    null);//执行控件的BeginInvoke

                
    ////======================1=========================////
                //此处的asyncResult.AsyncState对象就是BeginInvoke里的最后一个参数
                /*
                ExecQueryHandler execQueryHandler = asyncResult.AsyncState as ExecQueryHandler;
                DataSet dsReponse = null;
                if (asyncResult.IsCompleted)
                {
                    if (execQueryHandler != null)
                    {
                        dsReponse = new DataSet();
                        dsReponse = execQueryHandler.EndInvoke(asyncResult);
                        ISynchronizeInvoke async = this.dataGridView;
                        if (async.InvokeRequired)
                        {
                            async.Invoke(bindDataToGridInstance, new object[] { dsReponse });
                        }
                    }
                }
                
    */

                
    ////======================2=========================////
                AsyncResult originAsyncResult = asyncResult as AsyncResult;
                
    if (originAsyncResult != null)
                {
                    ExecQueryHandler execQuery 
    = (ExecQueryHandler)originAsyncResult.AsyncDelegate;
                    DataSet dsReponse 
    = execQuery.EndInvoke(asyncResult);

                    ISynchronizeInvoke async 
    = this.dataGridView;
                    
    //InvokeRequired == false表示来自主线程;为true表示来自异步线程
                    if (dataGridView != null && bindDataToGridInstance != null)
                    {
                        
    if (async.InvokeRequired)
                        {
                            async.Invoke(bindDataToGridInstance, 
    new object[] { dsReponse });
                        }
                    }
                    asyncResult.AsyncWaitHandle.Close();
    //显示的释放资源
                }
            }

            
    public delegate void SendRequestHandler();
            
    public SendRequestHandler sendRequestHandlerInstance = null;

            
    public delegate void EndHandler();
            
    public EndHandler endHandlerInstance = null;


            
    static void DoAnotherJob()
            {
                Thread.Sleep(
    1000);//需要1秒才能完成这个工作
                MessageBox.Show("[{0}]:Do Another Job", DateTime.Now.ToString());
            }

        }
    }
    代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;

    namespace WinApp
    {
        
    public class AsyncReadWrite
        {
            
    //同步读文件
            public static string SyncRead()
            {
                
    string path = @"d:\test.txt";
                FileStream fs 
    = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 20480false);
                StringBuilder sbReadResult 
    = new StringBuilder();
                
    using (fs)
                {
                    
    byte[] data = new byte[1024];
                    
    int nbyteReads;
                    
    do
                    {
                        nbyteReads 
    = fs.Read(data, 0, data.Length);
                        sbReadResult.Append(Encoding.Default.GetString(data, 
    0, nbyteReads));
                    } 
    while (nbyteReads > 0);
                    
    //Console.WriteLine(sbReadResult.ToString());
                }
                
    //Console.ReadLine();
                return sbReadResult.ToString().Trim();
            }

            
    //异步读文件
            public static string AsyncRead()
            {
                
    string path = @"d:\Query.txt";
                
    byte[] data = new byte[1024];
                FileStream fs 
    = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 20480true);
                StringBuilder sbReadResult 
    = new StringBuilder();
                AsyncCallback asyncCallback 
    = null;
                
    //匿名方法
                asyncCallback = delegate(IAsyncResult asyncResult)
                {
                    
    int nRead = fs.EndRead(asyncResult);
                    sbReadResult.Append(Encoding.Default.GetString(data, 
    0, nRead));

                    
    if (nRead > 0)
                    {
                        fs.BeginRead(data, 
    01024, asyncCallback, null);
                    }
                    
    else
                    {
                        fs.Close();
    //显示释放托管堆资源
                    }
                };
                IAsyncResult asyncReadResult 
    = fs.BeginRead(data, 01024, asyncCallback, null);
                
    return sbReadResult.ToString().Trim();
            }

            
    //异步写文件
            public static void AsyncWrite(string content)
            {
                
    string path = @"d:\write.txt";
                FileStream fs 
    = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, 20480true);
                
    byte[] data = Encoding.Default.GetBytes(content);
                AsyncCallback asyncCallback 
    = null;
                asyncCallback 
    = delegate(IAsyncResult async)
                {
                    fs.EndWrite(async);
                    fs.Close();
    //显示释放托管堆资源
                };
                IAsyncResult asyncWriteResult 
    = fs.BeginWrite(data, 0, data.Length, asyncCallback, null);
                Console.ReadLine();
            }
        }
    }
  • 相关阅读:
    秒杀多线程第八篇 经典线程同步 信号量Semaphore
    SURF特征
    (最短路径算法整理)
    中国大推力矢量发动机WS15 跨入 世界先进水平!
    SQL Profile 总结(一)
    Spring下@ResponseBody响应中文内容乱码问题
    Ubuntu12.04下jamvm1.5.4+classpath-0.98成功执行 helloworld.class
    【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
    [数据结构] N皇后问题
    DG之主库、备库切换(物理备库)
  • 原文地址:https://www.cnblogs.com/perfect/p/1564688.html
Copyright © 2011-2022 走看看